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

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

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

    [LV.2]偶尔看看I

    37

    主题

    387

    帖子

    1127

    积分

    金牌会员

    Rank: 6Rank: 6

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


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


    2. 使用中断的前后台结构

    2.1 程序结构

    当系统硬件支持的中断源被外部事件触发时,会产生中断信号传递到芯片内部的中断管理系统中,中断管理系统对中断信号进行仲裁,在判定可以响应后,打断CPU正常执行的程序,CPU临时转入执行中断源对应的服务程序,之后,CPU再返回到之前的正常程序继续执行,这就是单片机系统响应中断事件过程的简要描述。在应用程序对中断响应的设计需求下,将中断处理机制引入到基本超循环结构中去,从而产生了与之对应的“前后台”软件设计结构。
    图02.png
    图2

    在需要处理较多交互过程的单片机应用设计中,普遍使用的外部中断事件主要是定时器中断和引脚电平的脉冲中断,这两类中断事件通常作为一个“事件”的触发信号被系统所识别,从而在应用程序中被较为复杂的服务程序所处理。中断事件是由外部环境异步产生,对外部事件的响应“随叫随到”,对应的中断服务程序相对于main函数中的超循环相互独立,因此可以被看作是CPU执行程序的“另一条线程”。

    特点:使用硬件实现了多线程的,通过异步的中断可实现对外部事件实时响应。

    2.1 样例程序 (1个)

    Blinky_v1.3_UARTRx


    1. /*!
    2. * @file main.c
    3. * @author suyong_yq@126.com
    4. */

    5. #include "app_inc.h"

    6. void MyDelayMs(uint32_t ms)
    7. {
    8.     uint32_t i, j;

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

    17. int main(void)
    18. {
    19.     /* Initialize the board. */
    20.     BSP_InitSystem();
    21.     BSP_InitStdioUART(115200);
    22.     BSP_InitLEDGPIO();
    23.     BSP_InitKeyGPIO();

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

    25.     /* Led. */
    26.     GPIO_SetPinLogic(BSP_GPIO_LED1_PORT, BSP_GPIO_LED1_PIN, true);
    27.     GPIO_SetPinDir(BSP_GPIO_LED1_PORT, BSP_GPIO_LED1_PIN, true);
    28.     GPIO_SetPinLogic(BSP_GPIO_LED2_PORT, BSP_GPIO_LED2_PIN, true);
    29.     GPIO_SetPinDir(BSP_GPIO_LED2_PORT, BSP_GPIO_LED2_PIN, true);
    30.     GPIO_SetPinLogic(BSP_GPIO_LED3_PORT, BSP_GPIO_LED3_PIN, true);
    31.     GPIO_SetPinDir(BSP_GPIO_LED3_PORT, BSP_GPIO_LED3_PIN, true);
    32.     /* Key. */
    33.     GPIO_SetPinDir(BSP_GPIO_KEY1_PORT, BSP_GPIO_KEY1_PIN, false);
    34.     GPIO_SetPinDir(BSP_GPIO_KEY2_PORT, BSP_GPIO_KEY2_PIN, false);

    35.     printf("Press Key1/2 to switch on the Led1/2 ...\r\n");
    36.     printf("Type anything into terminal to toggle the Led3\r\n");

    37.     /* Enable the interrupt for UART0 Rx. */
    38.     NVIC_EnableIRQ(UART0_RX_TX_IRQn);
    39.     UART_SetIntEnabledOnRxBufferFull(UART0, true);

    40.     while (1)
    41.     {
    42.         /* Key1 -> Led1. */
    43.         if (!GPIO_GetPinLogic(BSP_GPIO_KEY1_PORT, BSP_GPIO_KEY1_PIN)) /* Key down. */
    44.         {
    45.             GPIO_SetPinLogic(BSP_GPIO_LED1_PORT, BSP_GPIO_LED1_PIN, false);
    46.             MyDelayMs(1000U);
    47.         }
    48.         else /* Key up. */
    49.         {
    50.             GPIO_SetPinLogic(BSP_GPIO_LED1_PORT, BSP_GPIO_LED1_PIN, true);
    51.         }
    52.         /* Key2 -> Led2. */
    53.         if (!GPIO_GetPinLogic(BSP_GPIO_KEY2_PORT, BSP_GPIO_KEY2_PIN)) /* Key down. */
    54.         {
    55.             GPIO_SetPinLogic(BSP_GPIO_LED2_PORT, BSP_GPIO_LED2_PIN, false);
    56.         }
    57.         else /* Key up. */
    58.         {
    59.             GPIO_SetPinLogic(BSP_GPIO_LED2_PORT, BSP_GPIO_LED2_PIN, true);
    60.         }
    61.     }
    62. }

    63. /* ISR for UART0 */
    64. void UART0_RX_TX_IRQHandler(void)
    65. {
    66.     volatile uint8_t tmp8;
    67.     /* ISR for RX. */
    68.     if (UART_IsRxBufferFull(UART0))
    69.     {
    70.         tmp8 = UART_GetRxData(UART0); /* Read rx data to clear rx flag. */

    71.         /* Toggle the Led3. */
    72.         GPIO_TogglePinLogic(BSP_GPIO_LED3_PORT, BSP_GPIO_LED3_PIN);
    73.     }
    74. }

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










    回复

    使用道具 举报

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

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条

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

    GMT+8, 2017-10-23 06:31 , Processed in 0.086703 second(s), 14 queries , Memcache On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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