轮询系统与前后台系统:
在我们学习嵌入式编程的时候,首先接触到的是裸机编程(轮询),裸机编程的实现比较简单,而且其逻辑也非常的清晰,通过观察代码就能大概判断程序的执行流程和作用,但是裸机编程有一个巨大的缺点——实时性太差。例如下列代码(伪):
while(1)
{
...(程序段一) if(key1==0) { ... } if(key2==0) { ... }
}
当我们在执行程序段一时,key1和key2两个按键的按下是不会有反应的(假设执行程序段一需要大量时间),又比如说我们在执行key1中的内容时,key2按键是不会反应的,且程序段一在很长一段时间内不会被执行,因为key1中的程序占用了cpu。
但是聪明的程序员们发明了一种程序系统——前后台系统,在前后台中,定义了许多中断,这些中断被称为“前台”,而具体程序的执行流程被称为“后台”。实现流程为下(伪代码):
int flag1=0; int flag2=0; int main() { while(1) { if(flag1==1) { } if(flag2==1) { } } } void ISR1(void) { flag1=1; } void ISR2(void) { flag2=1; }
我们注意到,在这个系统中,定义了几个中断,如果中断被触发,那么flag就快速的置一,这时主程序中扫描到flag置一,就跳入执行响应的程序。这样,整个系统的响应时间就大大缩短了,且可以在任何时候响应。
小巧但强大的RTOS(实时操作系统):
但是,如果系统非常复杂呢?如果希望两个程序块中的程序同时进行运算呢?(这里从使用者的角度上定义“同时”)这时我们就要使用RTOS(实时操作系统)系统了,而RTOS的实现大同小异,我个人比较喜欢RTThread,听大佬说,它有着令人舒适的类Linux编程风格,并且具有丰富的组件。
在RTThread系统中,最核心的东西就是线程,事件的处理在线程中完成,所有的核心都围绕着线程展开,线程和STM32中的中断一样,也具有优先级,系统通过优先级来判断哪个线程需要首先被执行。甚至可以让两个同优先级的线程同时执行(通过时间片机制)。
那么这个相对来说比较复杂的系统,会不会占用大量的资源呢?答案是不会的。下图是RTThead官方文档中心的简介:
这里我们可以看到RTThread(nano精简版本)甚至可以轻松的在stm32c8t6上运行。
最后,对于系统,并不能单纯的评定它们孰优孰劣,毕竟老话说的好——合适的才是最好的。
(纯手撸,转载望注明出处(但好像并不会有人转载)(¬、¬))