野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 11290|回复: 6

FreeRTOS移植到STM32F103C8不进main.c求助

[复制链接]
发表于 2020-3-15 12:32:00 | 显示全部楼层 |阅读模式
最近跟着野火教程在学FreeRTOS,第一部分已经看完。现在着手移植Free系统到STM32F103C8T6上运行,不试还以为啥都知道,一试心都灰了。业余爱好者也是刚玩STM32没多久,STM32的资源了解的也很少,目前还在只会点亮一个LED灯的阶段,但我就是想让这个LED灯在FreeRTOS环境里亮灭。
按照步骤添加了FreeRTOS的文件到工程中,头文件路径也对好了。编译工程,没有Error只有49个Warning。这是FreeRTOS里port.c`queue.c`heap4.c等几个文件的printf函数没有添加标准<stdio.h>头文件报的警告。但野火教程提供的例程里并没添加<stdio.h>头文件,同样的编译下来没有警告。不知道问题出在哪里,这些都不重要,因为添加<stdio.h>头文件后编译也是0 Error , 0 Warning。满信心的下载到STM32里,LED灯没亮,按复位,没亮,复位复位···
LED灯竟然没反应,那就软件调试看一下问题出在哪里?看到了,卡在启动文件里。
; Reset handler
Reset_Handler   PROC
                EXPORT  Reset_Handler             [WEAK]
                IMPORT  __main
                IMPORT  SystemInit
                LDR     R0, =SystemInit
                BLX     R0               
                LDR     R0, =__main
                BX      R0
                ENDP
就卡在:BX      R0    这里。
截图-0.jpg 截图-1.jpg
截图-2.jpg
截图-3.jpg
截图-4.jpg
截图-5.jpg
截图-6.jpg
截图-7.jpg

然后找原因,各种试,按教程步骤添加文件,还是没办法解决。在网上找到个比较类似的问题帖子: stm32跑不到main函数 。准备照帖子的方法试试,但在Keil MDK的安装文件夹里找不到<stdio.c>头文件,找不到printf函数的实现。记得Keil C51能找到<stdio.c>头文件的啊?就这样,不知道该怎么办了。
PS:期间,发现有的野火教程例子FreeRTOS配置文件的“系统所有总的堆大小”项:#define configTOTAL_HEAP_SIZE

回复

使用道具 举报

发表于 2020-3-15 16:31:32 | 显示全部楼层
魔术棒配置里面Use MricoLib打勾

写一句 #include <stdio.h>  鼠标右键H名,点open就进去了
回复 支持 2 反对 0

使用道具 举报

 楼主| 发表于 2020-3-16 22:18:23 | 显示全部楼层
WishWish 发表于 2020-3-15 16:31
魔术棒配置里面Use MricoLib打勾

写一句 #include   鼠标右键H名,点open就进去了

现在已经移植好了,应该是串口收发完数据后须切换任务,我是这么理解的。
打勾魔术棒配置里面Use MricoLib是可以进main.c函数里去,后来却又卡在启动文件另一个:B  指令的地方。
后面想截屏重现却怎么也转不到那里。昨天真的心都冷了,到正点原子网下个例子试试也是卡在一个循环的地方。我在想都跟教程不一样,以后要是买了板子不都没啥意义吗?因为连个简单的TreeRTOS都这么难,那GUI,LWIP,Linux我这种智商的是不是不用学了。当时真的太受打击了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 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); ” 就可以了。
惊不惊喜,意不意外?切换任务。

回复 支持 2 反对 0

使用道具 举报

发表于 2020-3-17 11:54:16 | 显示全部楼层
liuliangdt 发表于 2020-3-16 22:18
现在已经移植好了,应该是串口收发完数据后须切换任务,我是这么理解的。
打勾魔术棒配置里面Use MricoL ...

我也有同感,但我真没觉得 freertos 和 ucos简单。 它们只是体积小而已。而且我觉得你说的有道理,如果例子只能在一个类型的开发板上跑,确实没啥意义。
回复 支持 反对

使用道具 举报

发表于 2020-3-17 11:54:52 | 显示全部楼层
liuliangdt 发表于 2020-3-16 23:39
本来已经截好了移植FreeRTOS过程步骤的图片,传到这里给像我这样的菜鸟新手参考少踩点坑,现在才知道上传不 ...

很佩服你查错的能力。要是我。我就直接放弃了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-17 17:57:49 | 显示全部楼层
tianqi911 发表于 2020-3-17 11:54
我也有同感,但我真没觉得 freertos 和 ucos简单。 它们只是体积小而已。而且我觉得你说的有道理,如果例 ...

我现在只看了野火教程的第一部分,第二部分还没看。第六章有点点迷糊,最难的是第十一章,也不是很明白。第二部分看了一遍视频啥也没听明白,估计还是要细看教程才好。做界面和物联网的系统应该是很难吧?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-17 18:09:56 | 显示全部楼层
tianqi911 发表于 2020-3-17 11:54
很佩服你查错的能力。要是我。我就直接放弃了。

好几天就为了一个LED能闪烁,几天的时间就在一次次的试。试了几天都没成当时是有点不想玩了的。后面我就试着建一个只LED灯的工程,发现不要 void USART1_IRQHandler (void){ }  函数也可以。这样可能就不用那么几天才做好第一个工程了。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-4-25 23:52 , Processed in 0.032434 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表