freeRTOS之中断管理学习心得

移植了FREERTOS后就创建了几个TASK,内核中断和TASK之间一直用共享内存和全局变量进行通讯。这样做对于一个简单的工程来说虽然也没什么,但是随着内容的增加,代码结构会越来越臃肿丑陋,且缺少结构性。而没用到队列通信,信号量同步这些,也实在不能说了解和会用FREERTOS,整个工程也缺少了灵魂。

之所以不用,是因为有几个问题一直没搞明白,不会用也不敢用。

1、如何使用FREERTOS提供的ISR的函数?

2、想要使用FREERTOS提供的ISR的函数, 内核中断的优先级就要小于configMAX_SYSCALL_INTERRUPT_PRIORITY,这样freeRTOS会不会影响内核中断?

网上也查看了一段时间了,但是一直还是不能搞明白。在看了韦老师讲解的终于搞清楚了心中的几个疑惑

全网找到的讲的最清晰的文章 第十一章 中断管理(Interrupt Management) — 韦东山百问网freeRTOS教程 文档 (100ask.net)

(本来放的是CSDN的连接,但是我讨厌CSDN,不想给它做引流,于是把韦老师官网的连接挂上)

1、如何使用FREERTOS提供的ISR的函数?

  这个很简单,答案就是问题2。

  比如说configMAX_SYSCALL_INTERRUPT_PRIORITY = 5,那么UART的nvic_irq_pre_priority = 6,这样就可以在UART的中断服务程序里调用带有ISR的freeRTOS函数了。

void Usart_init()
{
    ...
    /* USART interrupt configuration */
	nvic_irq_enable(UART4_IRQn, 6, 0);
   ...
}
void UART4_IRQHandler(void)
{
	if(usart_flag_get(UART4,USART_INT_RBNEIE)!= RESET)
	{
		usart_flag_clear(UART4,USART_INT_RBNEIE);
	}
        
        xQueueSendToBackFromISR(...);
}

2、想要使用FREERTOS提供的ISR的函数, 内核中断的优先级就要小于configMAX_SYSCALL_INTERRUPT_PRIORITY,这样freeRTOS会不会影响内核中断?

  这里贴上韦老师文章里的这段话就能理解了:

 

   所以我们即使按照1设置了串口的中断等级=6,当来中断时,还是会打断TASK去执行UART中断的。所要注意的只是中断里调用的系统函数都要是xxFromISR()这种的,这种函数不会阻塞。这样就可以用FREERTOS系统函数实现中断与TASK之间的通信和同步了

posted @ 2022-11-16 17:12  xjxcxjx  阅读(141)  评论(0编辑  收藏  举报