1. 裸机应用代码框架
正常的裸机应用代码架构,由一个大while循环以及一些中断服务函数构成。如下图所示,中断服务函数叫前台程序,大while叫后台程序。这种前后台式的工作系统,本质上还是一个单任务的系统。
相对而言,单任务的系统实时性较差,后台的各个任务,不管紧急程序有多高,都要排着队轮循。
伪代码示例:
void main(void)
{
sys_init();
while(1)
{
task1();
task2();
task3();
feeddog();
}
}
void ISR1_handler(void)
{
dosomthing();
}
2. 跑RTOS的应用代码框架
实时操作系统是一个的多任务系统,应用代码可以根据架构、功能、紧急程度等细分为多个任务,每个任务所消耗的资源相互独立,任务与任务间可以通过信号量,消息队列,事件组等进行同步和数据交换。
如下图所示,是freertos的一个抢占式的实时多任务系统。通过任务调度,使得这些任务高效有序的“并发”进行。
根据任务优先等级的设定,来决定当前CPU的使用权归于哪个任务。高优先级的任务可以打断低优先级的任务,中断可以打断高优先级的任务。这样就可以保证紧急的任务都能够及时的响应。
伪代码示例:
void main(void)
{
sys_init();
//操作系统的创建任务的API函数,创建一个开始任务
xTaskCreate (start_task,
"start_task",
configMINIMAL_STACK_SIZE,
NULL,
1,
StartTaskHandle);
//调度器开始调度任务
vTaskStartScheduler();
//正常走不到这里
while(1)
{
printf("task does not work!!!\r\n ")
}
}
void start_task(void)
{
//创建task1
xTaskCreate (task1,
"task1",
configMINIMAL_STACK_SIZE,
NULL,
1,
Task1Handle);
//创建task2
xTaskCreate (task2,
"task2" ,
configMINIMAL_STACK_SIZE,
NULL,
1,
Task2Handle);
//创建task3
xTaskCreate (task3,
"task3",
configMINIMAL_STACK_SIZE,
NULL,
1,
Task3Handle);
//删除stark_task
vTaskDelete(StartTaskHandle);
}
void task1(void)
{
while(1)
{
task1_dosomething();
printf("task1 is working!!!\r\n");
}
}
void task2(void)
{
while(1)
{
task2_dosomething();
printf("task2 is working!!!\r\n");
}
}
void task3(void)
{
while(1)
{
task3_dosomething();
printf("task3 is working!!!\r\n");
}
}
void ISR1_handler(void)
{
dosomthing();
}
3. 比较
裸机 | 跑操作系统 | |
---|---|---|
实时性 | 一般 | 良好 |
可靠性 | 一般,某一处死循环后,导致整个功能瘫痪 | 良好,单个任务的死机不影响其他任务 |
资源消耗 | 所有资源都用在了应用代码功能上 | 需要一部分ram和rom的资源给操作系统 |
使用范围 | 功能简单,实时性可靠性要求不高的系统 | 功能复杂,需要满足实时性可靠性要求的 |