Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
内核学习营
在4K RAM的STM32F031运行rt-thread Nano
发布于 2019-04-09 22:08:51 浏览:3341
订阅该版
* 本帖最后由 robson 于 2019-4-9 22:08 编辑 * 以前在一些项目中接触过FreeRTOS,最近开始尝试rt-thread。由于手头上的电路板恰好是使用的STM32F031,其RAM只有4KB,准备直接上rt-thread Nano。百度了一圈之后,找到的相关文档、博文大都只讲到了用MDK添加了RTT NANO,可以使用rt_thread_delay()函数就截止了,由于没有后期的线程创建等相关内容,对于我这种能力又非常有限的人来说,接下来的工作还是很有难度的。于是我在讨论区开了一个帖子,询问关于RTT Nano在小内存MCU上运行的一些细节问题。非常感谢@Ernest、@yangjie、@zhs_sky对我的指导。本着社区的分享精神,现将RTT Nano在STM32F031的工程创建、线程创建做一个汇总,请论坛大神们指点,若有不当之处,还请指正。1、使用STM32CUBEMX创建MDK5工程,这部分内容应该都没有问题,不做说明。我手上的板子是使用的内部高速晶振,在CUBEMX中设置了倍频,实际主频48MHz。2、通过MDK的Pack Installer可以安装rt-thread nano,我使用的版本是3.1.2。![pack installer.bmp](/uploads/201904/09/194331gvqr756li4l5qloa.bmp)3、通过Manage Run-Time Environment添加rt-thread的kernal。至于其他内容的添加,我还没有完成。![Manage Run-Time Environment.bmp](/uploads/201904/09/194553lg4trgbbigw9vze1.bmp)4、添加完成后,即可直接编译,此时会提示有几个错误。错误主要是有3个中断服务函数重复定义,需要把stm32f0xx_it.c中的HardFault_Handler()、PendSV_Handler()、SysTick_Handler()3个函数注释掉,也可以删除掉。![第一次编译.bmp](/uploads/201904/09/195129uofzb3ceb8ev18gg.bmp)5、处理掉3个重复定义的函数后,再次编译,问题突然变复杂了,错误特别多。此时的错误,都是由于RAM空间不足造成的。![第二次编译.bmp](/uploads/201904/09/195256s4xsal381vkxpvsc.bmp)6、接下来是得先让编译能够通过,方法是通过修改rtconfig.h,修改这个头文件有一个向导模式,直接点点鼠标,改几个数字就可以了。在Basic Configuration中需要修改成被红框标记的内容。第一个是最多大优先级,从32级修改为8级,对于一个4KB RAM的MCU,8个优先级已经足够使用了;第二个修改的是每秒的tick数,这个参数的具体含义如果用RTOS应该都很熟悉,STM32F031最高只有48MHz的主频,用100也很合适,也就是每个tick 10ms;接下来是主线程的堆栈空间,默认1024,实际不需要这么大,可以先设置个256试试,我自己的程序设置为128也能够正常运行。![basic configuration.bmp](/uploads/201904/09/203951win9qkt3wc9monnk.bmp)7、修改完基本配置,再修改内存管理配置,Memory Management Configuration,只要取消掉动态堆管理即可。![Memory Management Configuration.bmp](/uploads/201904/09/204638buu7puxqugqohufp.bmp)8、剩余的两组配置一张图给出了,把这些功能都先取消掉,保证核心功能。![剩余配置.bmp](/uploads/201904/09/204859c2vkim29mkaijbkb.bmp)9、其余没有提及的配置,先不修改。然后保存编译,就可以通过编译。10、写个简单的程序,确认一下rt_thread_delay()函数可以使用,也就可以保证第一阶段工作完成。 在main.c中先包含头文件rtthread.h,然后在main()函数的while(1)中,添加PB0取反,并调用rt_thread_delay()函数,希望延时50个tick。```while (1) { /* USER CODE END WHILE */ HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_0); rt_thread_delay(50); /* USER CODE BEGIN 3 */ }```我的板子上PB0是连接的一个led,所以看起来很直观。编译,下载进MCU。LED闪是闪了,但是闪烁的频率好像不对。根据前面的设置1个tick是10ms,延时50个tick应该是500ms,LED闪烁频率应该是1Hz。实际看到的频率,远大于1Hz了。由此可以判断,有地方的配置肯定出了问题。 11、cubemx生成的工程,是通过调用SystemClock_Config()函数来完成PLL配置的,将系统时钟倍频到48MHz。main()函数一开头就调用了该函数,但是引入了RTT后,main()函数,不再是最早开始执行的函数。在components.c文件中,存在一个$Sub$$main()函数,该函数是最早执行的C代码。本函数中调用了两个函数,第一个函数是关中断的,对时钟不会有什么影响,所以需要关注rtthread_startup()。查看该函数的定义后,又调用了很多个函数,接下来关注rt_hw_board_init()函数,板级初始化。该函数中,先调用的就是系统时钟配置SystemCoreClockUpdate()函数。而该函数是在system_stm32f0xx.c中定义的一个函数,并不是使用cubemx生成的。因此,需要将main.c文件中的SystemClock_Config()函数在此处调用。将SystemClock_Config()函数在main.h中申明(需删除main.c中的申明)。然后在rt_hw_board_init()函数所在的board.c中包含main.h。再将SystemCoreClockUpdate()函数替换成SystemClock_Config()函数,并把main函数中的SystemClock_Config()去掉。编译,下载,情况还是一样。rt_hw_board_init()中调用的_SysTick_Config函数是配置SysTick定时器的,RTT是在该定时器的基础进行调度运行的。延时时间不对,基本可以确定是SysTick定时器没有按照预想的时间中断。回到main()函数,在HAL_Init()函数中,调用了HAL_InitTick()函数,该函数同样也会配置SysTick定时器,而且如果在cubemx中没有特别修改的话,该函数会把SysTick的中断时间配置成1ms,并且最终是通过HAL_InitTick()函数修改的SysTick配置寄存器,HAL_InitTick()函数为一个弱函数,因此可以在main.c中,直接顶一个空的HAL_InitTick函数,编译器就会用main.c中的HAL_InitTick函数,替换掉原函数。代码也可以看一下:```HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority) { return (HAL_StatusTypeDef)0; }```此时,编译,下载。LED闪烁频率变成1Hz,时钟配置部分完成。12、由于RAM空间受限,在配置RTT的时候,取消了动态堆栈管理,因此创建线程也不能使用动态创建,只能使用静态创建的方式。静态创建一个线程,功能还是LED闪烁。为了和刚才的功能有所区分,将闪烁频率设为2Hz,也就是延时25个tick。线程实现代码如下:```void led(void *pv) { while(1) { HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_0); rt_thread_delay(25); } }```main()函数中,在初始化代码之后,使用如下代码静态创建线程:```static struct rt_thread demo; static char demoStack[128]; rt_thread_init(&demo,"demo",led,RT_NULL,&demoStack[0],sizeof(demoStack),6,5); rt_thread_startup(&demo);```最后,删除掉main()函数中的while(1),这一步很重要。编译,下载,LED按2Hz的频率闪烁。 至此,整个过程完成。从cubemx创建工程,到添加rtt,配置RTT,修改时钟相关代码,最后到线程的创建,一个完整的工程创建完成。如果需要使用消息队列、定时器等系统资源,一方面在rtconfig.h中做必要设置,更重要的一点是只能使用静态创建的方法。再次感谢@Ernest、@yangjie、@zhs_sky对我的帮助,也希望这个帖子能够为RTT Nano入门遇到问题的朋友提供帮助。如有叙述错误,还请批评指正。
查看更多
7
个回答
默认排序
按发布时间排序
andychen
2019-04-10
这家伙很懒,什么也没写!
写的很详细
wuhanstudio
2019-04-10
这家伙很懒,什么也没写!
感谢分享,可不可以分享下跑 nano 还剩下多少 flash 和 ram :hug: 这样如果还有其他外设需求可以参考一下
robson
2019-04-10
这家伙很懒,什么也没写!
>感谢分享,可不可以分享下跑 nano 还剩下多少 flash 和 ram 这样如果还有其他外设需求可以参考一下 ... --- 按照帖子里的配置方式,创建一个样例线程,编译结果截图如下: [attach]8187[/attach] 另外,我这两天把以前用裸机写的一个程序迁移到了RTT上,使用了一个软件定时器(处理按键)、一个数码管扫描线程、一个消息队列(分配了200Byte的内存)、一个串口指令解析线程。RW+ZI=3240,code+RO=9856。
Fjf
2019-04-10
这家伙很懒,什么也没写!
你好,请问怎样才能进入“修改这个头文件有一个向导模式”?我的MDK版本是V5.25.2.0
wuhanstudio
2019-04-10
这家伙很懒,什么也没写!
>按照帖子里的配置方式,创建一个样例线程,编译结果截图如下: --- 谢谢, flash 还挺富余的 ;) 看样子主要是 ram 紧缺
robson
2019-04-10
这家伙很懒,什么也没写!
>谢谢, flash 还挺富余的 ;) 看样子主要是 ram 紧缺 --- 缺总是会缺的,在STM32F031上用FreeRTOS,创建的线程数量也是非常有限的,毕竟只有4K RAM。
撰写答案
登录
注册新账号
关注者
0
被浏览
3.3k
关于作者
robson
这家伙很懒,什么也没写!
提问
7
回答
17
被采纳
0
关注TA
发私信
相关问题
1
【内核学习】rtthread内核移植记录-STM32F103ZET6-HAL库
2
《内核学习营》+水一方+自用STM32F103VC 板RT-Thread内核移植分享
3
《内核学习营》+水一方+项目中创建标准的 RT-Thread工程
4
内核学习营+坦然+探索者stm32f407板子RT-thread循环点亮led灯
5
<内核学习营>+坦然+探索者stm32f407板子RT-thread串口字符点灯
6
<内核学习营>+坦然+探索者stm32f407板子RT-thread的pwm点灯实验
7
<内核学习营>+坦然+探索者stm32f407板子RT-thread串口实验
8
<内核学习营>+坦然+野火stm32f103板子RT-thread读写SD卡实验
9
<内核学习营>+坦然+探索者stm32f407板子RT-thread的RTC闹钟实验
10
【内核学习营】+王秀峰+led_rgb
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
关于studio文件构建及宏控制
2
cubemx RTThread Nano + vscode + cortex + EIDE 环境配置
3
【24嵌入式设计大赛】基于ulog日志管理系统
4
关于使用使用STLINK在RT-Studio里下载程序失败的问题的可能的解决方法
5
RVBacktrace RISC-V极简栈回溯组件V1.2
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
ART-Pi
FinSH
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
rt-smart
FAL
ESP8266
I2C_IIC
WIZnet_W5500
ota在线升级
UART
flash
packages_软件包
cubemx
freemodbus
PWM
BSP
潘多拉开发板_Pandora
定时器
ADC
中断
flashDB
socket
GD32
Debug
编译报错
msh
keil_MDK
rt_mq_消息队列_msg_queue
C++_cpp
at_device
MicroPython
ulog
本月问答贡献
rv666
9
个答案
2
次被采纳
踩姑娘的小蘑菇
8
个答案
2
次被采纳
道友
6
个答案
2
次被采纳
xiaorui
5
个答案
2
次被采纳
三世执戟
5
个答案
2
次被采纳
本月文章贡献
Licy
3
篇文章
1
次点赞
rv666
1
篇文章
7
次点赞
王依依
1
篇文章
5
次点赞
rtt_dmx
1
篇文章
5
次点赞
jaffer
1
篇文章
5
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部