有限状态机嵌入式系统
来源:互联网 发布:matlab求协方差矩阵 编辑:程序博客网 时间:2024/06/02 00:08
struct Task
struct Task task[TASKmax];
u8
u8
u8
void task1(void)
{
int i=0;
{
}}
void task2(void ){
for(j=0;j<2;j++)
printf("2\r\n");
};}
u8 TASK_dele(u8 cn){
return 1;}
void Task_tr(void )
{
u8 task_add(void (*function)(),
u8 delay,u8 period)
{
if(dex==TASKmax)
void Task_ref(void )//任务控制
{
u8 Task_tran;
Task_tran=Task_G;
}
void main(){
//初始化须要的变量
stateMachine + timerTick + queue。
在RTOS环境下的多任务模型:
任务通常阻塞在一个OS调用上(比如从消息队列取数据)。
外部如果想让该任务运转,就要向消息队列发送消息。
任务收到消息时,根据当前状态,决定如何处理消息。这就是状态机。
任务将消息队列中的消息处理完毕后,重新进入阻塞状态。
任务在处理中,有时要延时一段时间,然后才继续工作:
下面说说裸奔环境下的多任务模型:
裸奔也可以多任务,但调度是由用户自主控制。
在RTOS环境下,一般提供抢占式调度。在裸奔时,一般是任务在处理告一段落后,主动结束处理。
RTOS环境下的任务,一般处于一个while(1)循环中。
裸奔下的任务,一般采用查询方式:
{
}
裸奔任务其实也处于一个while(1)循环中,只不过这个循环在任务外部。
main()
{
}
状态机既适用于OS环境,也适用于裸奔环境。
但在裸奔环境下,状态可能被切分得更细。例如后面讲的如何在裸奔环境实现taskDelay()。
消息队列既适用于OS环境,也适用于裸奔环境。
在OS环境下,消息队列机制由OS提供。
在裸奔环境下,消息队列要自己来实现。如果对队列的概念不清楚,可参考《数据结构》教材。
这个队列机制,可做成通用模块,在不同的程序中复用。
消息队列用于缓冲事件。事件不知道什么时候会到来,也不能保证来了就能迅速得到处理。
一般在两种情况下会用到消息队列:
timerTick,就是系统中的时钟基准。OS中总是有一个这样的基准。
在裸奔时,我们要用一个定时器(或RTC或watchdog)来建立这个时间基准。
一个tick间隔可以设置为10ms(典型RTOS的缺省设置)。让定时器10ms中断一次,中断发生时给tickNum++。
系统时钟基准是所谓“零耗时裸奔”的基础。
timerTick的分辨率,决定了只适于于较大的时间延时。
OS中的taskDelay()在裸奔环境下的一种实现:
OS环境:
void xxxTask(void)
{
}
裸奔环境:
void xxxTask(void)
{
基于状态机控制的面向对象的前后台协从多任务系统设计
一、任务分析
根据题目要求,划分任务如下:
1、键盘扫描线程
2、灯显示线程
3、LED1-LED4四个独立线程
4、后台监视线程
5、串口收发中断
共计7个线程1个中断。
二、软件整体结构设计
后台 前台 串口中断
---------| --------------- --------------
| V | int10ms中断 | | serial中断 |
| ------------- --------------- --------------
| |监视monitor| | |
| ------------- ----------------- --------------
| | |键盘扫描keyscan| | 收 RI 检查 |
---------| ----------------- --------------
|
二、软件整体结构设计