为什么在k210上使用多核smp总是会卡死?每次都卡在了rt_cpus_lock上
查看更多
这个缺乏上下文啊,是否代码中使用了哪些操作?例如enter_critical?
不使用smp没有问题,打开smp就经常会卡住,就是在中断中用了rt_hw_interrupt_disable和rt_hw_interrupt_enable,或者是rt_interrupt_enter()和rt_interrupt_leave(),后来全部去掉了也不行。
rt_hw_interrupt_disable
rt_hw_interrupt_enable
rt_interrupt_enter()
rt_interrupt_leave()
多核环境下,建议使用spinlock。
默认情况下rt_hw_interrupt_disable和rt_hw_interrupt_enable都是用的spinlock,所以这儿卡住spinlock里了
#ifdef RT_USING_SMPrt_base_t rt_hw_local_irq_disable();void rt_hw_local_irq_enable(rt_base_t level);#define rt_hw_interrupt_disable rt_cpus_lock#define rt_hw_interrupt_enable rt_cpus_unlock#elsert_base_t rt_hw_interrupt_disable(void);void rt_hw_interrupt_enable(rt_base_t level);#endif /*RT_USING_SMP*/
#ifdef RT_USING_SMP
rt_base_t rt_hw_local_irq_disable();
void rt_hw_local_irq_enable(rt_base_t level);
#define rt_hw_interrupt_disable rt_cpus_lock
#define rt_hw_interrupt_enable rt_cpus_unlock
#else
rt_base_t rt_hw_interrupt_disable(void);
void rt_hw_interrupt_enable(rt_base_t level);
#endif /*RT_USING_SMP*/
rt_base_t rt_cpus_lock(void){ rt_base_t level; struct rt_cpu* pcpu; level = rt_hw_local_irq_disable(); pcpu = rt_cpu_self(); if (pcpu->current_thread != RT_NULL) { register rt_uint16_t lock_nest = pcpu->current_thread->cpus_lock_nest; pcpu->current_thread->cpus_lock_nest++; if (lock_nest == 0) { pcpu->current_thread->scheduler_lock_nest++; rt_hw_spin_lock(&_cpus_lock); } } return level;}RTM_EXPORT(rt_cpus_lock);
rt_base_t rt_cpus_lock(void)
{
rt_base_t level;
struct rt_cpu* pcpu;
level = rt_hw_local_irq_disable();
pcpu = rt_cpu_self();
if (pcpu->current_thread != RT_NULL)
register rt_uint16_t lock_nest = pcpu->current_thread->cpus_lock_nest;
pcpu->current_thread->cpus_lock_nest++;
if (lock_nest == 0)
pcpu->current_thread->scheduler_lock_nest++;
rt_hw_spin_lock(&_cpus_lock);
}
return level;
RTM_EXPORT(rt_cpus_lock);
我也遇到同样的情况,不知道是不是两个核同步的问题?请问解决了么?
可能跟 RISC-V 的监管者模式有关,这部分需要处理下的,目前的代码中没有进行处理。
欢迎发表与嵌入式相关的技术分享、开发技巧、工具介绍、技术设想、职业心得、行业评论等对他人有启发,排版优雅的文章
回到 顶部
发布 问题
分享 好友
手机 浏览
投诉 建议
回到 底部