使用串口通讯遇到Function[rt_sem_take] shall not be used in ISR

发布于 2019-12-06 11:28:39
    本帖最后由 JonasWen 于 2019-12-6 11:32 编辑


定位到rt_debug.h(100)——rt_interrupt_get_nest() = 0xFE
rt_interrupt_nest是在函数rt_interrupt_leave()中由0减到0xFE的
所有的rt_interrupt_leave()和rt_interrupt_enter()都是成对使用的
static rt_err_t uart_rx_ind(rt_device_t dev, rt_size_t size)
{
/* 串口接收到数据后产生中断,调用此回调函数,然后发送接收信号量 */
rt_sem_release(&rx_sem);

return RT_EOK;
}

static uint8_t uart_get_char(void)
{
uint8_t ch;

while (rt_device_read(dwin_serial, -1, &ch, 1) != 1)
{
rt_sem_take(&rx_sem, RT_WAITING_FOREVER);
}
}
void dwin_serial_thread_entry(void *parameter)
{
uint8_t ch;
char data[ONE_DATA_MAXLEN];
while(1)
{
ch = uart_get_char();
}
}

查看更多

关注者
0
被浏览
363
5 个回答
JonasWen
JonasWen 2019-12-06
    本帖最后由 JonasWen 于 2019-12-6 12:05 编辑


yangjie 发表于 2019-12-6 11:52
Function[rt_sem_take] shall not be used in ISR

是你在中断中使用 获取信号量的操作造成的 ...

没有在中断中使用,我只在线程中做了操作,现在会停顿在断言处,但并不是一直出现,系统运行一段时间后才会发生这种现象,没有规律可循
void USART3_IRQHandler(void)
{
/* enter interrupt */
rt_interrupt_enter();

extern volatile rt_uint8_t rt_interrupt_nest;
if(rt_interrupt_nest == RT_NULL)
{
RT_ASSERT(rt_interrupt_nest);
}

uart_isr(&(uart_obj[UART3_INDEX].serial));

/* leave interrupt */
rt_interrupt_leave();
}


JonasWen
JonasWen 2019-12-06
    本帖最后由 JonasWen 于 2019-12-6 14:29 编辑


yangjie 发表于 2019-12-6 13:36
看提示确实是这样呀,楼主可以在检查下代码

已经检查问题查了两天了,也没有其他什么复杂的代码,就是串口来回通讯,如果是因为中断中获取信号量导致的也就不特地发帖求助了现在从仿真和断言的结果来看是rt_interrupt_nest意外的变化导致的,但是中断对rt_interrupt_nest操作都是成对出现的,进入中断加计数,退出中断减计数
JonasWen
JonasWen 2020-04-13
填一下坑
MCU使用的是STM32F429IG
硬件设计时外围电路没有按照手册设计,VREF+、VCAP_1、VCAP_2、PDR_ON都悬空,导致MCU跑飞

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友