嵌入式应用场景下的代码框架构成虽然多种多样,但梳理总结下来基本就是三种形式,分别是裸机系统、前后台系统,以及抢占式操作系统。本篇将简要介绍这三种资源调度系统的区别。
1、裸机系统
顾名思义,裸机系统即没有任何的操作系统,所有的任务在一个大循环里不断的轮训运行,该形式能实现简单应用的短平快开发,也是比较初级的嵌入式框架形式。
代码类型如下所示:
int main(void)
{
Hardware_Init();
/*在完成硬件资源初始化后,则所有的任务都在一个大循环中轮训*/
while(1)
{
Task_1();
Task_2();
Task_3();
}
}
2、前后台系统
该系统的区别于裸机系统的的最大特点就是引入了硬件中断,在中断触发以及裸机轮训的配合下实现对整体的资源调度,引入中断后能够对一些动作的响应更加的快速。
unsigned char TimeFlag = 0;
unsigned char GpioFlag = 0;
//周期中断处理函数
void SysTick_handler(void)
{
TimeFlag = 1;
}
//GPIO触发中断处理函数
void CanRecv_Handler(void)
{
GpioFlag = 1;
}
int main(void)
{
Hardware_Init();
while(1)
{
//定时中断触发置位后执行该部分动作
if(1 == TimeFlag)
{
TimeFlag = 0;
Task_Time();
}
//GPIO中断触发置位后执行该部分动作
if(1 == GpioFlag)
{
GpioFlag = 0;
Task_Gpio();
}
}
}
3、抢占式操作系统
常见的嵌入式用操作系统有UCOS/FreeRTOS/RT-Thread等。带有硬件抢占式特点的操作系统可管理多线程任务运行,每个线程都有独立的堆栈资源/优先级,实现了一个MCU运行出多个各自独立的前后台/裸机系统的效果。高的优先级任务可以打断低优先级任务的运行,在执行完高优先级任务后能继续回滚低优先级被打断处继续运行。可做到某一个线程如果死循环卡住,不会影响其他高优先级线程的运行。线程之间也有通信交互机制,使得资源的管理和传递更加的清晰以及MCU的利用更加的高效。
void Task_handler_1(void)
{
while(1)
{
Task_1();
}
}
void Task_handler_2(void)
{
while(1)
{
Task_2();
}
}
int main(void)
{
Hardware_Init();
//将任务线程注册到操作系统中
OS_Task_Register(Task_handler_1);
OS_Task_Register(Task_handler_2);
OS_Start();
while(1)
{
//正常情况下操作系统是不会运行到此处
}
}
|