1.
1)裸机系统第一种就是轮询:
即 只需要按固定顺序执行相关的代码动作即可,不需要考虑外部事件。
同时也就是说,只能顺序执行。
比如LED翻转,串口输出,液晶显示。
- int main(void)
- {
- /* 硬件相关初始化 */
- HardWareInit();
-
- /* 无限循环 */
- for (;;) {
- /* 处理事情 1 */
- DoSomething1();
-
- /* 处理事情 2 */
- DoSomethingg2();
-
- /* 处理事情 3 */
- DoSomethingg3();
- }
- }
缺点在于对比之下的有外部事件参与的情况:
如果有外部事件,还用轮询的话,那么会出现实时响应不行的情况。
因为假如事件按1,2,3按键扫描的顺序执行,事件执行到1号按键事件的时候,需要很久才能执行完,一直到1号按键释放都不能执行完,那么当轮询到3号事件的时候,就会丢掉一次事件,因为1那里卡住了,后面3这里时候还在搞1,直接3就被跳过了。
2.) 那么因此裸机第二种就是前后台系统
前台就是中断
后台就是main函数里面的那个死循环
- int flag1 = 0;
- int flag2 = 0;
- int flag3 = 0;
-
- int main(void)
- {
- /* 硬件相关初始化 */
- HardWareInit();
-
- /* 无限循环 */
- for (;;) {
- if (flag1) {
- /* 处理事情 1 */
- DoSomething1();
- }
-
- if (flag2) {
- /* 处理事情 2 */
- DoSomethingg2();
- }
-
- if (flag3) {
- /* 处理事情 3 */
- DoSomethingg3();
- }
- }
- }
-
- void ISR1(void)
- {
- /* 置位标志位 */
- flag1 = 1;
- /* 如果事件处理时间很短,则在中断里面处理
- 如果事件处理时间比较长,在回到后台处理 */
- DoSomething1();
- }
-
- void ISR2(void)
- {
- /* 置位标志位 */
- flag2 = 2;
-
- /* 如果事件处理时间很短,则在中断里面处理
- 如果事件处理时间比较长,在回到后台处理 */
- DoSomething2();
- }
-
- void ISR3(void)
- {
- /* 置位标志位 */
- flag3 = 1;
- /* 如果事件处理时间很短,则在中断里面处理
- 如果事件处理时间比较长,在回到后台处理 */
- DoSomething3();
- }
缺点: 虽然事件的响应和处理是分开了,但事件的处理还是在后台里面顺序执行的。
但相比轮询系统,前后台系统确保了事件不会丢失,再加上中断具有可嵌套的功能,这可以大大的提高程序的实时响应能力。
2.多线程---也就是在事件的处理上做出改进,响应还是中断,处理由后台里面用循环顺序执行,变成了依靠多线程来处理,这些线程也有优先级,优先级高的会被先执行,这样就更加灵活和实时了。
在代码上就是,把程序主体分成一个个独立的小程序,每个小程序叫做一个线程。这些小程序它的特点是每个都是独立,无限循环,并且不能返回的。这样每个小程序就相当于是独立的一个循环。
- int flag1 = 0;
- int flag2 = 0;
- int flag3 = 0;
-
- int main(void)
- {
- /* 硬件相关初始化 */
- HardWareInit();
-
- /* OS 初始化 */
- RTOSInit();
-
- /* OS 启动,开始多线程调度,不再返回 */
- RTOSStart();
-
- while(1);/* 程序不会执行到这里 */
- }
-
- void ISR1(void)
- {
- /* 置位标志位 */
- flag1 = 1;
- }
-
- void ISR2(void)
- {
- /* 置位标志位 */
- flag2 = 2;
- }
-
- void ISR3(void)
- {
- /* 置位标志位 */
- flag3 = 1;
- }
-
- void DoSomething1(void)
- {
- /* 无限循环,不能返回 */
- for (;;) {
- /* 线程实体 */
- if (flag1) {
-
- }
- }
- }
-
- void DoSomething2(void)
- {
- /* 无限循环,不能返回 */
- for (;;) {
- /* 线程实体 */
- if (flag2) {
-
- }
- }
- }
-
- void DoSomething3(void)
- {
- /* 无限循环,不能返回 */
- for (;;) {
- /* 线程实体 */
- if (flag3) {
-
- }
- }
- }