JonasWen
JonasWen
This guy hasn't written anything yet

注册于 2 years ago

回答
5
文章
1
关注者
0

在drv_adc.c文件中添加。以STM32举例,stm32_adc_enabled函数中,有一个if(enable)分支,使能ADC的时候把校准加进去,这样就和裸机启动ADC时候校准的逻辑一样了

请修改链接脚本以扩大ROM大小

先用scons -c清理一下bsp目录下的cconfig.h再编译试试看

https://www.bilibili.com/video/BV11V41127pq
B站大佬做的FOC驱动器,可以参考看看,操作系统有操作系统的优势,裸机有裸机的优势,如果没想清楚为什么要用操作系统的话建议不要用

填一下坑
MCU使用的是STM32F429IG
硬件设计时外围电路没有按照手册设计,VREF+、VCAP_1、VCAP_2、PDR_ON都悬空,导致MCU跑飞

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


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

已经检查问题查了两天了,也没有其他什么复杂的代码,就是串口来回通讯,如果是因为中断中获取信号量导致的也就不特地发帖求助了现在从仿真和断言的结果来看是rt_interrupt_nest意外的变化导致的,但是中断对rt_interrupt_nest操作都是成对出现的,进入中断加计数,退出中断减计数

    本帖最后由 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();
}


shjic 发表于 2019-10-23 11:29
我一会儿会提个pr


看到了,测试下来没有问题,感谢

yangjie 发表于 2019-10-23 10:30
试下3.0.1版本


看了下源码中调度的代码,感觉可能有同样的问题

yangjie 发表于 2019-10-23 10:30
试下3.0.1版本


今天试一下,主要是env工具在3.1之前的版本上感觉不太好用,所以昨天没直接上

MurphyZhao 发表于 2019-10-23 09:01
LZ 使用的是哪个 BSP,用的哪个板子?

我在 QEMU 上测试正常。


考虑到移植可能出现的问题,所以我刚才在野火的103和429上也做了同样的测试。只加入signal_sample示例代码,打开内核中的signal。也都无法得到正常响应信号的结果。

MurphyZhao 发表于 2019-10-23 09:01
LZ 使用的是哪个 BSP,用的哪个板子?

我在 QEMU 上测试正常。


STM32F411CEU6核心板,使用的是stm32f411-st-nucleo的bsp,用CubeMX略微调整了MCU的一些初始化,更新了hal库。只加入了signal_sample的示例代码,没有其他任何新增代码。
后来还尝试了STM32F103C8核心板,也是一样的现象。
直接用MCU仿真的

在调用rt_thread_handle_sig(RT_TRUE)前使能中断会再次跳转到rt_schedule()调度,等到跳转回执行rt_thread_handle_sig(RT_TRUE)时,rt_current_thread已经被改变

JonasWen 发表于 2019-10-22 16:04
scheduler.c line 244

使能中断后无法运行到rt_thread_handle_sig(RT_TRUE);


/* check signal status */
rt_thread_handle_sig(RT_TRUE);

rt_hw_interrupt_enable(level);

回到
顶部

发布
问题

投诉
建议