目录
中断是指在程序执行的过程中,突然发生了某种事件,需要立即停止当前正在执行的程序,并转而处理这个事件,处理完后再回到原来的程序执行点继续执行的过程。
中断可以是硬件中断(由硬件设备触发)或软件中断(由程序执行中断指令触发)。
中断可以提高计算机的响应速度和效率,使得计算机可以同时处理多个任务。
任何中断的优先级都大于任务!
在我们的操作系统,中断同样是具有优先级的,并且我们也可以设置它的优先级,但是他的优先 级并不是从 0~15 ,默认情况下它是从 5~15 ,0~4 这 5 个中断优先级不是 FreeRTOS 控制的(5是 取决于 configMAX_SYSCALL_INTERRUPT_PRIORITY)。
1. 在中断中必需使用中断相关的函数;
2. 中断服务函数运行时间越短越好。
xQueueReceiveFromISR()
xQueuePeekFromISR()
xSemaphoreGiveFromISR()
xSemaphoreTakeFromISR()
xEventGroupClearBitsFromISR()
xEventGroupSetBitsFromISR()
xTaskNotifyFromISR()
xTaskNotifyAndQueryFromISR()
vTaskNotifyGiveFromISR()
xTimerStartFromISR()
xTimerStopFromISR()
xTimerResetFromISR()
xTimerChangePeriodFromISR()
创建一个队列及一个任务,按下按键 KEY1 触发中断,在中断服务函数里向队列里发送数据,任 务则阻塞接收队列数据。
打开CubeMX
1.将FreeRTOS移植到STM32F103C8T6,具体看我之前写过的文章
2.在NVIC中使能中断
3.中断代码示例:
用到的中断函数
stm32f1xx_it.c
- #include "cmsis_os.h" // 增加CubeMX封装好的头文件
-
- extern osMessageQId myQueue01Handle;
-
- void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
- {
- uint32_t snd = 1;
- xQueueSendFromISR(myQueue01Handle, &snd, NULL);
- }
4.主程序代码示例:
freertos.c
- void StartDefaultTask(void const * argument)
- {
- uint32_t rev = 0;
- for(;;)
- {
- if (xQueueReceive(myQueue01Handle, &rev, portMAX_DELAY) == pdTRUE)
- printf("rev = %d\r\n", rev);
- osDelay(1);
- }
- }
5.打开串口助手,查看结果