按照文档中心提供的Finsh移植当中,使用串口中断的方式,其中使用了信号量,调用了rt_sem_create(),但是调用rt_sem_take就出出现硬件错误,发现是 rt_ipc_list_suspend(&(sem->parent.suspend_thread),
thread, sem->parent.parent.flag);这块出问题,不知道为什么?mcu:stm32f103
查看更多
第二段代码中,如果rt_sem_take失败,就rt_sem_delete了,等下一轮循环,shell_rx_sem就不存在了,从而造成内存非法访问.所有这里sem的用法有问题,需要再斟酌一下sem的用法
发布 问题
分享 好友
手机 浏览
回到 顶部
如果持有sem失败,可以不做任何事情,
我觉得问题不在这里,我的程序在rt_sem_delete之前有打印,但是并没有打印出来。而且如果我只调用rt_sem_take(shell_rx_sem, RT_WAITING_FOREVER);其他的都不要,一样会出现硬件错误。
还是觉得你的sem用法有问题.
rt_sem_take是为了获取console的控制权吧?!,在此之前又先调用了xxx_getchar,
这个顺序似乎是矛盾的,sem是为了保护console而设的,而应用时,是否sem_take又以_getchar成功为条件,就好比你把钥匙锁屋里了,又要用这个钥匙开门.
可能我分析的也不对,希望有专家来解答一下.