嵌入式技术论坛
直播中

刘军

8年用户 1480经验值
私信 关注
[问答]

在什么情况下信号量断言会失效呢?

连接stlink调试的时候发现,485通信线上有大量数据,不是主机发的,不知道从哪里来的,然后单步调试运行一会,会卡在dummy == 0这里

void rt_assert_handler(const char *ex_string, const char *func, rt_size_t line)
{
    volatile char dummy = 0;
    if (rt_assert_hook == RT_NULL)
    {
#ifdef RT_USING_MODULE
        if (dlmodule_self())
        {
            /* close assertion module */
            dlmodule_exit(-1);
        }
        else
#endif /*RT_USING_MODULE*/
        {
            rt_kprintf("(%s) assertion failed at function:%s, line number:%d \n", ex_string, func, line);
            while (dummy == 0);
        }
    }
    else
    {
        rt_assert_hook(ex_string, func, line);
    }
}
看一下打印信息里的参数,提示是下面函数的断言失效,
问题一:在什么情况下,一个信号量的类型不是信号量呢?

rt_err_t rt_sem_release(rt_sem_t sem)
{
    register rt_base_t temp;
    register rt_bool_t need_schedule;
    /* parameter check */
    RT_ASSERT(sem != RT_NULL);
    RT_ASSERT(rt_object_get_type(&sem->parent.parent) == RT_Object_Class_Semaphore);
问题二:有开门狗,平时打断点让代码停下,时间一长,看门狗会复位,但是现在死循环卡在上面dummy那里,为什么看门狗反而不起作用了呢。


回帖(7)

刘军

2023-5-11 14:35:48
RTOS环境下,如果中断服务函数里的回调函数卡在了while循环,还会进行线程切换吗?看了一下,这个信号量释放的函数是在串口接收中断服务函数的回调函数里执行的。相当于中断服务函数里有一个while循环,还会进行线程切换吗?感觉等systick中断服务函数执行完,还是会继续在这个中断服务函数里执行,这时候不能喂狗,如果有看门狗的话应该会重启吧。
举报

李平

2023-5-11 14:35:58
卡在中断函数里面线程是没法运行的,看门狗不复位是不是这个时候看门狗都还没初始化到
举报

王辉

2023-5-11 14:36:07
程序跑飞了呗,在不应该调用到这个函数的时候调用了它。
看门狗在debug的时候,打断点看门狗也会暂停的吧。中断里的while循环不会再回到线程调度。也就不会再喂狗,但是看门狗没动作,说明看门狗也被杀死了呗
举报

王辉

2023-5-11 14:36:12
莫名的大量数据,肯定是线路上由硬件引入的呗。因为收到大量数据,导致程序跑飞,看门狗死掉又说明软件有bug,应付不了这种大量接收数据的情况了
举报

刘军

2023-5-11 14:36:19
看门狗是硬件设备,不喂狗就会复位,为什么会被杀死呢
举报

王辉

2023-5-11 14:36:26
寄存器被修改,看门狗就禁用了
举报

李平

2023-5-11 14:36:33
可能是信号量还没初始化就触发中断了,检查一下是不是先开了串口中断再初始化的信号量
举报

更多回帖

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