一个合适的软件架构不仅结构清晰,而且可以便于开发与维护。 便于帮助开发者把握整个工程的框架 三种常用的软件架构:
1.顺序执行的前后台系统 2.时间片轮询系统 3.多任务操作系统
顺序执行的前后台系统 程序以变量标志的同步方式在前台main函数和后台中断服务函数中执行。
int main(void)
{
System_init();
while(1)
{
...
if( x <= y)
{
x1();
}
else
{
x2();
}
}
return 0;
}
void InterrupTime0() interrupt 1
{
...
if(times == 10)
{
y1();
}
else if(times == 20)
{
y2();
}
}
优点:易于理解,简单 缺点:若每个任务所占cpu时间过长,会导致程序实时性差,如按键的检测等
时间片轮询系统 选择一个定时器,每进入一次定时器中断自加,在主循环中根据这个值执行任务,这个计数值是任务轮询的时间片。
int main(void)
{
System();
while(1)
{
if ( times == 10 )
{
x1();
}
else if ( times == 20 )
{
x2();
}
else if ( times == 30 )
{
x3();
}
}
return 0;
}
void InterruptTimer0() interrupt 1
{
...
times++;
if( times == 31)
{
times = 0;
}
}
优点: 既有顺序执行法的优点,也有操作系统的部分优点。
多任务操作系统 实时性高,比较复杂 比如ucos、freertos
TaskHandle_t x1_TaskHandler;
TaskHandle_t x2_TaskHandler;
int main()
{
System_init();
xTaskCreate( LED_Task, "LED_Task", 256, (void*)0, 1, &LED_TaskHandler);
xTaskCreate( KEY_Task, "KEY_Task", 256, NULL, 2, &KEY_TaskHandler);
vTaskStartScheduler();
while(1);
return 0;
}
void LED_Task(void *pvParameters )
{
while(1)
{
LED_Operate();
vTaskDelay(100);
}
}
void KEY_Task(void *pvParameters )
{
u8 key = 1;
while(1)
{
...
vTaskDelay(100);
}
}
如何正确选择合适的软件架构 1.具体的应用场景 2.是否要求实时性高 3.成本问题 4.单片机是否资源匮乏
|