博士
最后登录1970-1-1
在线时间 小时
注册时间2018-10-1
|
楼主 |
发表于 2020-3-16 23:39:34
|
显示全部楼层
本帖最后由 liuliangdt 于 2020-3-21 15:33 编辑
本来已经截好了移植FreeRTOS过程步骤的图片,传到这里给像我这样的菜鸟新手参考少踩点坑,现在才知道上传不来。我就简述一下过程
就拿野火教程一个已经做好例子来说,依次打开:
[野火]《FreeRTOS内核实现与应用开发实战指南》系列 > 1-书籍配套程序 > 3-增值程序:FreeRTOS+基础外设 > 02-Fire-F103MINI-FreeRTOS-KEY > Project。
为什么拿这个例子来说呢?因为这里有串口驱动。我是网上卖的最便宜最小的那款STM32F103C8T6开发板,所以就把按键功能删了保留串口和LED的任务。
先点击魔术棒,进 : Target ,打勾里面配置选项 : Use MicroLIB 。选择: Device , 将默认的单片机型号改为:STM32F103C8 。
然后在选: C/C++ > Define栏。将:STM32F10X_HD 改为 STM32F10X_MD 。
启动文件: startup_stm32f10x_hd.s 也改为: startup_stm32f10x_md.s 。
编译后报: Error:L6406E & L6407E,就参考 基于STM32F103C8T6移植Free-RTOS中内存不足的问题(一)
将FreeRTOS配置文件 FreeRTOSConfig.h:
#define configTOTAL_HEAP_SIZE ((size_t)(36 * 1024)) /* 系统总堆栈大小 */
改为
#define configTOTAL_HEAP_SIZE ((size_t)(10 * 1024)) /* 系统总堆栈大小 */
这是再编译就是 0 Error(s), 0 Warning(s)了,但你要是调试就会卡在某个循环语句或者跳到启动文件的: B 指令的地方, 这时就参考 FreeRTOS 启动进程调度后,程序卡死的部分原因分析。 。“串口1中断但未能查找到对应的USART1_IRQHandler中断服务程序”。这就是卡住的原因了,跟串口1相关。这里给出了原因,却没给解决的方法出来。最后再参考: stm32 freertos 之串口中断 就好了。把“
一、中断处理函数
void USART1_IRQHandler(void)
{
BaseType_t xHigherPriorityTaskWoken;
xHigherPriorityTaskWoken = pdFALSE;
u8 cChar;
if (USART_GetITStatus (USART1,USART_IT_RXNE) != RESET)
{
cChar = USART_ReceiveData (USART1);
xQueueSendToBackFromISR (xQueueRx,&cChar,&xHigherPriorityTaskWoken);
portYIELD_FROM_ISR (xHigherPriorityTaskWoken);
}
}
” 放到系统能找到的地方。我试了一下,只要有“ portYIELD_FROM_ISR(xHigherPriorityTaskWoken); ” 就可以了。
惊不惊喜,意不意外?切换任务。
|
|