单片机的程序架构
1.顺序执行2.时间片轮寻:==2.0 一个定时器的复用:====2.1 时间片轮询架构:====2.2 具体实现:==2.2.1定义 任务结构体2.2.2初始化 任务结构体2.2.3定义 任务清单&任务数目 枚举类型2.2.4编写 定时器中断函数&任务处理函数2.2.5编写main函数2.2.6编写你的任务函数
==2.3 注意点==
3.操作系统:
1.顺序执行
int main(void)
{
uint8 keyValue
;
InitSys();
while (1)
{
TaskDisplayClock();
keyValue
= TaskKeySan();
switch (keyValue
)
{
case x
: TaskDispStatus(); break;
...
default: break;
}
}
}
2.时间片轮寻:
2.0 一个定时器的复用:
【中断过于频繁效率就低,中断太长,实时性差】——设置合适的定时器中断时间
①首先定义任务数、任务定时初值(任务轮询时间=定时初值*定时器中断时间)、任务定时计数器。②在定时器中断服务函数中添加【复用函数】
#define TASK_NUM (3)
uint16 TaskCount
[TASK_NUM
] ;
uint8 TaskMark
[TASK_NUM
];
void TimerInterrupt(void)
{
uint8 i
;
for (i
=0; i
<TASKS_NUM
; i
++)
{
if (TaskCount
[i
])
{
TaskCount
[i
]--;
if (TaskCount
[i
] == 0)
{
TaskMark
[i
] = 0x01;
}
}
}
}
定时中断服务函数中:对任务逐个判断 定时计数到了没有 & 置标志为1 & 定时计数初值重置
如果定时值为0了,表示没有使用此定时器或此定时器已经完成定时,已经处理。
如果定时值不为0,定时器减一, 这时为零时,相应标志位值1,表示此任务的定时值到了
2.1 时间片轮询架构:
两个函数+一个结构体======》时间片轮询架构
typedef struct _TASK_COMPONENTS
{
uint8 Run
;
uint8 Timer
;
uint8 ItvTime
;
void (*TaskHook
)(void);
} TASK_COMPONENTS
;
void TaskRemarks(void)
{
uint8 i
;
for (i
=0; i
<TASKS_MAX
; i
++)
{
if (TaskComps
[i
].Timer
)
{
TaskComps
[i
].Timer
--;
if (TaskComps
[i
].Timer
== 0)
{
TaskComps
[i
].Timer
= TaskComps
[i
].ItvTime
;
TaskComps
[i
].Run
= 1;
}
}
}
}
void TaskProcess(void)
{
uint8 i
;
for (i
=0; i
<TASKS_MAX
; i
++)
{
if (TaskComps
[i
].Run
)
{
TaskComps
[i
].TaskHook();
TaskComps
[i
].Run
= 0;
}
}
}
2.2 具体实现:
2.2.1定义 任务结构体
typedef struct _TASK_COMPONENTS
{
uint8 Run
;
uint8 Timer
;
uint8 ItvTime
;
void (*TaskHook
)(void);
} TASK_COMPONENTS
;
2.2.2初始化 任务结构体
static TASK_COMPONENTS TaskComps
[] =
{
{0, 60, 60, TaskDisplayClock
},
{0, 20, 20, TaskKeySan
},
{0, 30, 30, TaskDispStatus
},
};
2.2.3定义 任务清单&任务数目 枚举类型
typedef enum _TASK_LIST
{
TAST_DISP_CLOCK
,
TAST_KEY_SAN
,
TASK_DISP_WS
,
TASKS_MAX
} TASK_LIST
;
2.2.4编写 定时器中断函数&任务处理函数
void TaskRemarks(void)
{
uint8 i
;
for (i
=0; i
<TASKS_MAX
; i
++)
{
if (TaskComps
[i
].Timer
)
{
TaskComps
[i
].Timer
--;
if (TaskComps
[i
].Timer
== 0)
{
TaskComps
[i
].Timer
= TaskComps
[i
].ItvTime
;
TaskComps
[i
].Run
= 1;
}
}
}
}
void TaskProcess(void)
{
uint8 i
;
for (i
=0; i
<TASKS_MAX
; i
++)
{
if (TaskComps
[i
].Run
)
{
TaskComps
[i
].TaskHook();
TaskComps
[i
].Run
= 0;
}
}
}
2.2.5编写main函数
初始化函数在while(1)外任务处理函数在while(1)里
int main(void)
{
InitSys();
while (1)
{
TaskProcess();
}
}
2.2.6编写你的任务函数
void TaskDisplayClock(void)
{
}
void TaskKeySan(void)
{
}
void TaskDispStatus(void)
{
}
2.3 注意点
任务与任务间数据传递时,数据传递要采用全局变量
3.操作系统:
FreeRTOS、鸿蒙os~~~【略】
>>>这是一篇学习笔记,感谢博主:@Good__life