对于单片机来说,大家都不陌生,而且从大学开始的时候,我们这一代就开始从郭天祥的51单片机,虽然说这本书作为入门级别是非常好,但是如果真的要出来工作的时候,确实需要吸收好多知识才能胜任工作,之前看过一篇文章叫
《浅谈单片机应用程序架构》,我就开始想着如何实现里面的功能代码,这位大神没有直接给出源代码,但是都十分详细地描述了如何实现,大家可以先看下:
但是在实践中遇到过不小的问题:比如可能因为keil的原因,里面使用结构体数组的时候会出现莫名bug,
TaskComps[i].Timer = TaskComps[i].ItvTime; //TaskComps[i].ItvTime会出现无法赋值给TaskComps[i].Timer
开始初始化:
{
uint8 Run; // 程序运行标记:0-不运行,1运行
uint8 Timer; // 计时器
uint8 ItvTime; // 任务运行间隔时间
void (*TaskHook)(void); // 要运行的任务函数
} TASK_COMPONENTS; // 任务定义
对应的是Run=0,Timer=8,ItvTime=8,函数名operation();
开始运行到函数:
仿真的数值是:
再运行:
仿真数值:
TaskComps[i].Timer = TaskComps[i].ItvTime; //
TaskComps[i].ItvTime
会出现无法赋值给
TaskComps[i].Timer
考虑下是否是keil优化级别,但是貌似也没有关系。
考虑keil的优化级别,所以决定来个一个局部静态变量来存储
TaskComps[i].ItvTime;
void core(void)
{
unsigned char core_num;
static unsigned char ItvTime; //局部静态变量
for(core_num=0;core_num<TASKS_MAX;core_num++)
{
if(TaskComps[core_num].Timer)
{
TaskComps[core_num].Timer--;
if(TaskComps[core_num].Timer==0)
{
ItvTime=TaskComps[core_num].ItvTime;
TaskComps[core_num].Timer=ItvTime;
TaskComps[core_num].Run=1;
}
}
}
}
这样就可以解决得了:
TaskComps[i].ItvTime
赋值给
TaskComps[i].Timer