请选择 进入手机版 | 继续访问电脑版
搜索
查看: 365|回复: 3

[原创] 《K64进阶笔记》节选-嵌入式系统软件的典型开发框架(1)

[复制链接]
  • TA的每日心情
    奋斗
    2017-1-17 10:45
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    37

    主题

    387

    帖子

    1127

    积分

    金牌会员

    Rank: 6Rank: 6

    积分
    1127
    发表于 2017-1-11 21:50:45 | 显示全部楼层 |阅读模式
    嵌入式系统软件的典型开发框架


    • 基本的超循环结构
    • 使用中断的前后台结构
    • 完全依赖中断的事件驱动系统
    • 状态机驱动系统——玩转按键
    • 总结


    1. 基本的超循环结构


    1.1 程序结构


    超循环结构是最基本的嵌入式应用程序组织架构。
    在通常情况下,整个单片机应用程序就是在运行一个周而复始、无休无止的超循环。因此,单片机应用程序的设计内容都必须围绕着这个超循环的执行方式进行。在没有中断等其它通路的情况下,程序就在这个超循环中“一根筋”地顺序执行,一旦在中间某个过程被阻塞,那么整个循环的进程都会被卡在这里,这就是基本的超循环程序结构的特点。

    优点:逻辑最简单、最易于实现。
    缺点:多个功能之间的耦合性强,任何一个环节出现问题,整个应用程序就会被卡住。

    图01.png
    图1

    1.2 样例程序(3个)

    超循环程序结构样例工程之一——BlinkyLED

    小灯闪烁

    1. /*!
    2. * @file main.c
    3. * @author suyong_yq@126.com
    4. */
    5. #include "app_inc.h"

    6. /*!
    7. * @brief 空跑延时函数
    8. */
    9. void MyDelayMs(uint32_t ms)
    10. {
    11.     uint32_t i, j;

    12.     for (i = 0U; i < ms; i++)
    13.     {
    14.         for (j = 0U; j < 60000; j++)
    15.         {
    16.             __ASM("NOP");
    17.         }
    18.     }
    19. }

    20. int main(void)
    21. {
    22.     /* 初始化板级配置 */
    23.     BSP_InitSystem();
    24.     BSP_InitStdioUART(115200);
    25.     BSP_InitLEDGPIO();

    26.     printf("\r\nBlinky_轮询 Project.\r\n");

    27.     /* Led1. */
    28.     GPIO_SetPinLogic(BSP_GPIO_LED1_PORT, BSP_GPIO_LED1_PIN, true);
    29.     GPIO_SetPinDir(BSP_GPIO_LED1_PORT, BSP_GPIO_LED1_PIN, true);

    30.     while (1)
    31.     {
    32.         GPIO_TogglePinLogic(BSP_GPIO_LED1_PORT, BSP_GPIO_LED1_PIN);
    33.         MyDelayMs(200U);
    34.     }
    35. }
    36. /* EOF. */
    复制代码
    超循环程序结构样例工程之二——Blinky_Polling工程

    在超循环结构中周而复始地轮询按键状态,对应改变LED灯的亮灭状态。

    1. /*!
    2. * @file main.c
    3. * @author suyong_yq@126.com
    4. */
    5. #include "app_inc.h"

    6. int main(void)
    7. {
    8.     /* Initialize the board. */
    9.     BSP_InitSystem();
    10.     BSP_InitStdioUART(115200);
    11.     BSP_InitLEDGPIO();
    12.     BSP_InitKeyGPIO();

    13.     printf("\r\nBlinky_Key Project.\r\n");

    14.     /* Led. */
    15.     GPIO_SetPinLogic(BSP_GPIO_LED1_PORT, BSP_GPIO_LED1_PIN, true);
    16.     GPIO_SetPinDir(BSP_GPIO_LED1_PORT, BSP_GPIO_LED1_PIN, true);
    17.     GPIO_SetPinLogic(BSP_GPIO_LED2_PORT, BSP_GPIO_LED2_PIN, true);
    18.     GPIO_SetPinDir(BSP_GPIO_LED2_PORT, BSP_GPIO_LED2_PIN, true);
    19.     /* Key. */
    20.     GPIO_SetPinDir(BSP_GPIO_KEY1_PORT, BSP_GPIO_KEY1_PIN, false);
    21.     GPIO_SetPinDir(BSP_GPIO_KEY2_PORT, BSP_GPIO_KEY2_PIN, false);

    22.     printf("Press Key1/2 to switch on the Led1/2 ...\r\n");

    23.     while (1)
    24.     {
    25.         /* Key1 -> Led1. */
    26.         if (!GPIO_GetPinLogic(BSP_GPIO_KEY1_PORT, BSP_GPIO_KEY1_PIN)) /* Key down. */
    27.         {
    28.             GPIO_SetPinLogic(BSP_GPIO_LED1_PORT, BSP_GPIO_LED1_PIN, false);
    29.         }
    30.         else /* Key up. */
    31.         {
    32.             GPIO_SetPinLogic(BSP_GPIO_LED1_PORT, BSP_GPIO_LED1_PIN, true);
    33.         }
    34.         /* Key2 -> Led2. */
    35.         if (!GPIO_GetPinLogic(BSP_GPIO_KEY2_PORT, BSP_GPIO_KEY2_PIN)) /* Key down. */
    36.         {
    37.             GPIO_SetPinLogic(BSP_GPIO_LED2_PORT, BSP_GPIO_LED2_PIN, false);
    38.         }
    39.         else /* Key up. */
    40.         {
    41.             GPIO_SetPinLogic(BSP_GPIO_LED2_PORT, BSP_GPIO_LED2_PIN, true);
    42.         }
    43.     }
    44. }

    45. /* EOF. */
    复制代码


    超循环程序结构样例工程之三——Blinky_GetCharx4工程


    开始引入人机交互,使用getchar()阻塞超循环的执行,从而控制程序运行的节奏。



    1. /*!
    2. * @file main.c
    3. * @author suyong_yq@126.com
    4. */
    5. #include "app_inc.h"

    6. struct GpioPinStruct
    7. {
    8.     GPIO_Type *PortDevPtr;
    9.     uint32_t PinIdx;
    10. } gAppGpioLedArray[] =
    11. {
    12.     {BSP_GPIO_LED1_PORT, BSP_GPIO_LED1_PIN},
    13.     {BSP_GPIO_LED2_PORT, BSP_GPIO_LED2_PIN},
    14.     {BSP_GPIO_LED3_PORT, BSP_GPIO_LED3_PIN},
    15.     {BSP_GPIO_LED4_PORT, BSP_GPIO_LED4_PIN}
    16. };

    17. #define APP_LED_COUNT    (sizeof(gAppGpioLedArray)/sizeof(gAppGpioLedArray[0]))

    18. int main(void)
    19. {
    20.     uint32_t i;;

    21.     /* Initialize the board. */
    22.     BSP_InitSystem();
    23.     BSP_InitStdioUART(115200);
    24.     BSP_InitLEDGPIO();

    25.     printf("\r\nHello, World\r\n");

    26.     for (i = 0U; i < APP_LED_COUNT; i++)
    27.     {
    28.         /* Set GPIOs' initial voltage level as high. */
    29.         GPIO_SetPinLogic(gAppGpioLedArray[i].PortDevPtr, gAppGpioLedArray[i].PinIdx, true);
    30.         /* Set GPIOs' pin dir as output. */
    31.         GPIO_SetPinDir(gAppGpioLedArray[i].PortDevPtr, gAppGpioLedArray[i].PinIdx, true);
    32.     }

    33.     printf("Press any key to blink the LED ...\r\n");

    34.     while (1)
    35.     {
    36.         for (i = 0U; i < APP_LED_COUNT; i++)
    37.         {
    38.             getchar();
    39.             GPIO_TogglePinLogic(gAppGpioLedArray[i].PortDevPtr, gAppGpioLedArray[i].PinIdx);
    40.         }
    41.     }
    42. }

    43. /* EOF. */
    复制代码

















    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2016-12-30 13:56
  • 签到天数: 13 天

    [LV.3]偶尔看看II

    5

    主题

    158

    帖子

    657

    积分

    高级会员

    Rank: 4

    积分
    657
    发表于 2017-1-12 08:44:25 | 显示全部楼层
    Blinky_GetCharx4工程功能和描述不一致吧?getchar()应该改成while(!getchar()),否则会顺序执行下一条语句。
    • printf("Press any key to blink the LED ...\r\n");
    •     while (1)
    •     {
    •         for (i = 0U; i < APP_LED_COUNT; i++)
    •         {
    •             getchar();
    •             GPIO_TogglePinLogic(gAppGpioLedArray.PortDevPtr, gAppGpioLedArray.PinIdx);
    •         }
    •     }

    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2017-1-17 10:45
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    37

    主题

    387

    帖子

    1127

    积分

    金牌会员

    Rank: 6Rank: 6

    积分
    1127
     楼主| 发表于 2017-1-12 09:41:12 | 显示全部楼层
    zmh169 发表于 2017-1-12 08:44
    Blinky_GetCharx4工程功能和描述不一致吧?getchar()应该改成while(!getchar()),否则会顺序执行下一条语句 ...

    getchar()本身就是以轮询方式实现的,自带阻塞功能。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2016-12-30 13:56
  • 签到天数: 13 天

    [LV.3]偶尔看看II

    5

    主题

    158

    帖子

    657

    积分

    高级会员

    Rank: 4

    积分
    657
    发表于 2017-1-16 09:15:00 | 显示全部楼层
    suyong_yq 发表于 2017-1-12 09:41
    getchar()本身就是以轮询方式实现的,自带阻塞功能。

    对getchar()的函数功能不了解,以为没输入的时候就会返回空字符 ‘\0’
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    Archiver|手机版|小黑屋|恩智浦技术社区    

    GMT+8, 2017-12-15 16:20 , Processed in 0.456515 second(s), 14 queries , Memcache On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

    快速回复 返回顶部 返回列表