嵌入式学习小组
直播中

王静

7年用户 1543经验值
私信 关注

如何保证FreeRtos中运行的函数不被,底层的硬件中断打断?

目前的平台是:在STM32 F207上跑FreeRtos系统
现象:操作VK3366这款芯片时(扩展了一个串口,其中串口接收通过中断来实现的),发现有时(时间不定,有时跑几个小时,有时几天)读取的寄存器的值是错误的(乱的)
原因分析:推测可能执行读操作时,被接收中断给断掉啦
问题1:FreeRtos中的优先级和F207中的中断优先级有关系吗?是如何关联的
问题2:如何保证FreeRtos中运行的函数不被,底层的硬件中断打断


肯请熟悉的大侠指点,小弟在此拜谢!!!

回帖(15)

吴觅

2020-7-29 07:10:30
1、中断不可大于RTOS的最低中断,一般是11
2、不可被硬件打断?那不要做了。。。。
举报

张海燕

2020-7-29 07:21:48
非常感谢你的回复
现在中断优先级是这样设定的
#define configKERNEL_INTERRUPT_PRIORITY         255
#define configMAX_SYSCALL_INTERRUPT_PRIORITY 191 /* equivalent to 0xb0, or priority 11. */
VK3366中断
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F;
不被硬件中断,可能没有表述清楚,是这样的,在执行下边这个函数时,不想被VK3366的接收中断,因为在中断中也会操控VK3366的寄存器,也就是说有没有什么方法使得下边的函数时一个原子操作
void UART_SendData( uint16_t UARTx, uint16_t data )
{
uint16_t ch, data1, addr;
/* Check the parameters */
  assert_param(IS_UART_ALL_PERIPH(UARTx));
ch = UARTx;
addr = SFDR << 9;
data1 = 0x8000 | ch | addr | data ;
SPI_VK3366_CS_LOW();//ê1?üVK3224μ?SPI1|?ü
SPI_Send_Data( data1 );
SPI_VK3366_CS_HIGH();
}
举报

徐娟

2020-7-29 07:39:51
1、 如果想屏蔽中断,则进入临界区,你百度下FREERTOS的临界区函数,我是记不住这个,用到时,也是百度函数名的
2、那个191就是相当于STM32的优先级11
     你别的中断,如果用了freertos的API ,优先级则不可大于11
举报

华农武

2020-7-29 07:46:46

是不是说
如果按照我现在的定义,在vk3366的接收中断里面不可以调用freertos的api函数
举报

更多回帖

发帖
×
20
完善资料,
赚取积分