嵌入式软件设计多采用,事件触发,与时间触发型。开发工程师可以根据个人需要进行灵活选用。
鉴于此,个人认为充电桩软件架构为时间触发为主环,事件触发为辅环;
以下以直流桩软件设计为例;
一、为何时间触发为主环;
1、例如:智能计量电表,通常情况下,计量电表的周期一般为0.5S~1S;设想一下,如果把读取电表数值放置在main函数的while(1)中会是什么结果,有多少是有用的?
2、GB/T 27930中明确规定了各个报文的超时已经发送周期;
3、读卡器,操作过程,一般需要询-验-读等步骤,然双方设备(充电桩控制板与读卡器)对各自的数据均需要处理时间,一直执行肯定不行,间隔时间太长也不行;
4、充电模块,因其内部有PID控制环路,响应更需要时间。
5、等;
6、综上所述,为了提高软件效率,为了避免非重要任务占用了重要任务(GB/T 27930),建议将各个功能任务建立成时间触发型。
二、事件触发为辅环的意义;
根据GB/T18487.1 2015中充电时序的要求,其必须要有状态标记当前充电流程所在步骤,这里省略。
三、时间的设定;
如上:一中,1,智能电表为例,这里建议读取电表时间为0.5S,太小没有意义,例如0.1S;太长计量不精确,例如:3S;
四、优先级
根据各个功能在软件系统中的重要性,划分任务执行优先级;
五、其他建议;
建议使用FRTOS,或者uCOS;
其中uCOS注意使用的版本,以及OS_TMR_EN,OS_APP_HOOKS_EN这两个宏定义,初学者建议版本不要超过V2.85,有点基础的可使用V2.9或以上;
以上是个人感悟,欢迎讨论,拍砖。谢谢。
附软件核心结构体:
typedef struct { void (*pTask)(void); //具体任务函数 uint16_t Delay; //延迟; uint16_t Period; //周期; uint8_t TaskID; //任务ID编号; uint8_t RunMe; //是否运行; uint8_t SignTimeOut; //是否判定超时信号 uint16_t TaskTimeOut; //超时; uint16_t TimeOutRecover; //任务超时恢复; void (*pTaskTimeOut)(); //超时任务; }aTaskModel; 上述结构体为非操作系统情况下使用。 |