在线时间58 小时
UID175586
注册时间2010-3-14
NXP金币0
TA的每日心情 | 奋斗 2017-1-17 10:45 |
---|
签到天数: 3 天 连续签到: 1 天 [LV.2]偶尔看看I
高级会员

- 积分
- 780
- 最后登录
- 2023-11-17
|
嵌入式系统软件的典型开发框架
- 基本的超循环结构
- 使用中断的前后台结构
- 完全依赖中断的事件驱动系统
- 状态机驱动系统——玩转按键
- 总结
3. 完全依赖中断的事件驱动系统
3.1 程序结构
在以外部交互为主的应用场景中,只有当外部触发事件发生之时,系统才会执行相应的处理,而待机的情况下几乎不需要做任何事情。在这种情况下,开发者更多关注的是根据触发事件设计好前台程序,在后台的超循环中不需要运行任何常驻的程序。甚至为了减少耗电,程序被设计成一旦从前台程序返回后台,就通过执行特殊命令,关掉系统的部分时钟和供电,进入低功耗模式。此时,整个应用的设计几乎是完全抛弃掉后台程序,只设计前台程序,那么整个程序就完全依赖于外部事件触发的中断进行驱动。
特点:开发者只需要针对每个事件(中断源)编写相应的中断服务程序就可以了,而每个中断服务程序的函数相当于是一个个短小但又能完成独立功能的任务,程序逻辑简单清晰。
图3
3.2 样例程序(1个)
Blinky_v1_4_UartRx_LowPower工程
- /*!
- * @file main.c
- * @author suyong_yq@126.com
- */
- #include "app_inc.h"
- int main(void)
- {
- /* Initialize the board. */
- BSP_InitSystem();
- BSP_InitStdioUART(115200);
- BSP_InitLEDGPIO();
- printf("\r\nBlinky v1.4 Project.\r\n");
- /* Led. */
- GPIO_SetPinLogic(BSP_GPIO_LED3_PORT, BSP_GPIO_LED3_PIN, true);
- GPIO_SetPinDir(BSP_GPIO_LED3_PORT, BSP_GPIO_LED3_PIN, true);
- printf("Type anything into terminal to toggle the Led3\r\n");
- /* Enable the interrupt for UART0 Rx. */
- NVIC_EnableIRQ(UART0_RX_TX_IRQn);
- UART_SetIntEnabledOnRxBufferFull(UART0, true);
- while (1) /* Endless loop. */
- {
- __ASM("WFI");
- }
- }
- /* ISR for UART0 */
- void UART0_RX_TX_IRQHandler(void)
- {
- volatile uint8_t tmp8;
- /* ISR for RX. */
- if (UART_IsRxBufferFull(UART0))
- {
- tmp8 = UART_GetRxData(UART0); /* Read rx data to clear rx flag. */
- /* Toggle the Led3. */
- GPIO_TogglePinLogic(BSP_GPIO_LED3_PORT, BSP_GPIO_LED3_PIN);
- }
- }
- /* EOF. */
复制代码
|
|