• 学习--RTOS速读


    1.

    1)裸机系统第一种就是轮询:

      即 只需要按固定顺序执行相关的代码动作即可,不需要考虑外部事件。

      同时也就是说,只能顺序执行。

     比如LED翻转,串口输出,液晶显示。

    1. int main(void)
    2. {
    3. /* 硬件相关初始化 */
    4. HardWareInit();
    5. /* 无限循环 */
    6. for (;;) {
    7. /* 处理事情 1 */
    8. DoSomething1();
    9. /* 处理事情 2 */
    10. DoSomethingg2();
    11. /* 处理事情 3 */
    12. DoSomethingg3();
    13. }
    14. }

     缺点在于对比之下的有外部事件参与的情况:

        如果有外部事件,还用轮询的话,那么会出现实时响应不行的情况。

       因为假如事件按1,2,3按键扫描的顺序执行,事件执行到1号按键事件的时候,需要很久才能执行完,一直到1号按键释放都不能执行完,那么当轮询到3号事件的时候,就会丢掉一次事件,因为1那里卡住了,后面3这里时候还在搞1,直接3就被跳过了。

    2.)  那么因此裸机第二种就是前后台系统

    前台就是中断

    后台就是main函数里面的那个死循环

    1. int flag1 = 0;
    2. int flag2 = 0;
    3. int flag3 = 0;
    4. int main(void)
    5. {
    6. /* 硬件相关初始化 */
    7. HardWareInit();
    8. /* 无限循环 */
    9. for (;;) {
    10. if (flag1) {
    11. /* 处理事情 1 */
    12. DoSomething1();
    13. }
    14. if (flag2) {
    15. /* 处理事情 2 */
    16. DoSomethingg2();
    17. }
    18. if (flag3) {
    19. /* 处理事情 3 */
    20. DoSomethingg3();
    21. }
    22. }
    23. }
    24. void ISR1(void)
    25. {
    26. /* 置位标志位 */
    27. flag1 = 1;
    28. /* 如果事件处理时间很短,则在中断里面处理
    29. 如果事件处理时间比较长,在回到后台处理 */
    30. DoSomething1();
    31. }
    32. void ISR2(void)
    33. {
    34. /* 置位标志位 */
    35. flag2 = 2;
    36. /* 如果事件处理时间很短,则在中断里面处理
    37. 如果事件处理时间比较长,在回到后台处理 */
    38. DoSomething2();
    39. }
    40. void ISR3(void)
    41. {
    42. /* 置位标志位 */
    43. flag3 = 1;
    44. /* 如果事件处理时间很短,则在中断里面处理
    45. 如果事件处理时间比较长,在回到后台处理 */
    46. DoSomething3();
    47. }
    缺点:  虽然事件的响应和处理是分开了,但事件的处理还是在后台里面顺序执行的。
      但相比轮询系统,前后台系统确保了事件不会丢失,再加上中断具有可嵌套的功能,这可以大大的提高程序的实时响应能力。
    

    2.多线程---也就是在事件的处理上做出改进,响应还是中断,处理由后台里面用循环顺序执行,变成了依靠多线程来处理,这些线程也有优先级,优先级高的会被先执行,这样就更加灵活和实时了。

          在代码上就是,把程序主体分成一个个独立的小程序,每个小程序叫做一个线程。这些小程序它的特点是每个都是独立,无限循环,并且不能返回的。这样每个小程序就相当于是独立的一个循环。

    1. int flag1 = 0;
    2. int flag2 = 0;
    3. int flag3 = 0;
    4. int main(void)
    5. {
    6. /* 硬件相关初始化 */
    7. HardWareInit();
    8. /* OS 初始化 */
    9. RTOSInit();
    10. /* OS 启动,开始多线程调度,不再返回 */
    11. RTOSStart();
    12. while(1);/* 程序不会执行到这里 */
    13. }
    14. void ISR1(void)
    15. {
    16. /* 置位标志位 */
    17. flag1 = 1;
    18. }
    19. void ISR2(void)
    20. {
    21. /* 置位标志位 */
    22. flag2 = 2;
    23. }
    24. void ISR3(void)
    25. {
    26. /* 置位标志位 */
    27. flag3 = 1;
    28. }
    29. void DoSomething1(void)
    30. {
    31. /* 无限循环,不能返回 */
    32. for (;;) {
    33. /* 线程实体 */
    34. if (flag1) {
    35. }
    36. }
    37. }
    38. void DoSomething2(void)
    39. {
    40. /* 无限循环,不能返回 */
    41. for (;;) {
    42. /* 线程实体 */
    43. if (flag2) {
    44. }
    45. }
    46. }
    47. void DoSomething3(void)
    48. {
    49. /* 无限循环,不能返回 */
    50. for (;;) {
    51. /* 线程实体 */
    52. if (flag3) {
    53. }
    54. }
    55. }

     

  • 相关阅读:
    一句话生成长视频
    1154:亲和数
    边缘计算网关的主要功能有哪些?天拓四方
    Mendix:企业成功执行数字化转型的9个因素
    Spring中还有一招集合注入的写法
    驱动隐藏进程(eprocess断链)
    Java 编程性能调优
    09【C语言 & 趣味算法】再识:折半查找(二分查找):基本思想、程序流程图及完整代码、附:顺序查找
    面试再也不怕问ThreadLocal了
    Redis基础运维及问题排查
  • 原文地址:https://blog.csdn.net/weixin_51431342/article/details/132020122