讨论实现单片机程序架构(STC15W204S单片机)

时间:2021-12-14 19:47:43
       对于单片机来说,大家都不陌生,而且从大学开始的时候,我们这一代就开始从郭天祥的51单片机,虽然说这本书作为入门级别是非常好,但是如果真的要出来工作的时候,确实需要吸收好多知识才能胜任工作,之前看过一篇文章叫
《浅谈单片机应用程序架构》,我就开始想着如何实现里面的功能代码,这位大神没有直接给出源代码,但是都十分详细地描述了如何实现,大家可以先看下:
但是在实践中遇到过不小的问题:比如可能因为keil的原因,里面使用结构体数组的时候会出现莫名bug,
TaskComps[i].Timer = TaskComps[i].ItvTime;       //TaskComps[i].ItvTime会出现无法赋值给TaskComps[i].Timer
开始初始化:
讨论实现单片机程序架构(STC15W204S单片机)
 // 任务结构
typedef struct _TASK_COMPONENTS
{
    uint8 Run;                 // 程序运行标记:0-不运行,1运行
    uint8 Timer;              // 计时器
    uint8 ItvTime;              // 任务运行间隔时间
    void (*TaskHook)(void);    // 要运行的任务函数
} TASK_COMPONENTS;       // 任务定义
对应的是Run=0,Timer=8,ItvTime=8,函数名operation();

开始运行到函数:
讨论实现单片机程序架构(STC15W204S单片机)

仿真的数值是:
讨论实现单片机程序架构(STC15W204S单片机)
再运行:
讨论实现单片机程序架构(STC15W204S单片机)

仿真数值:
讨论实现单片机程序架构(STC15W204S单片机)
  讨论实现单片机程序架构(STC15W204S单片机)
  经过仿真运行后,发现是
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;
}
}
}
}
这样就可以解决得了:
讨论实现单片机程序架构(STC15W204S单片机)
讨论实现单片机程序架构(STC15W204S单片机)
  TaskComps[i].Timer = TaskComps[i].ItvTime;       
TaskComps[i].ItvTime 赋值给 TaskComps[i].Timer