OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7806|回复: 10

rt thread 移植到战舰开发板,非nano版本,使用最新源码

[复制链接]

119

主题

439

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1185
金钱
1185
注册时间
2015-9-18
在线时间
422 小时
发表于 2017-11-24 18:36:21 | 显示全部楼层 |阅读模式
哎,说来惭愧,今天一整天就干了一件事情,移植rt thread到战舰开发板(注意,非nano版本)。

首先给出rt thread 3.0版本的源码链接,http://www.openedv.com/forum.php ... &extra=page%3D1(不知道为什么,我从git上下载的源文件无法解压),这里要“严重”感谢八度大神

移植的过程:
<1>添加文件。
001.png
<2>添加路径。
002.png
<3>stm32f10x_it.c文件注释掉HardFault中断,PendSV中断和Systick中断。
<4>打开宏#define RT_USING_USER_MAIN(在进入main()之前需要先初始化相关硬件,内核等)。
004.png
<5>在rtthread_startup()中调用rt_system_heap_init()初始化堆内存(因为在进入main之前需要创建系统任务,而系统任务是使用rt_thread_create()来创建的,也就是使用动态内存)。
005.png

对于上述第5点:
<1>按照我这种处理方式,不需要修改启动文件,原子的rtt nano版本教程需要将启动文件的heap size设置为0。
<2>因为是定义为数组,所以在编译期间这块内存就已经分配了,不会被其它数据抢占内存。
<3>我觉得rtt作者不会想不到需要初始化堆内存,所以我严重怀疑这里似乎“另有隐情”
如果有了解的朋友,还请指教下,非常谢谢。

最后,给出我移植好的整个工程,只做了2个线程,实现2个led交替闪烁。如果有不足之处,还请大家帮忙指教,感谢大家。
链接:http://pan.baidu.com/s/1i4UefLN
密码:zmve

电子爱好者
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

11

主题

1041

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3693
金钱
3693
注册时间
2011-5-23
在线时间
2008 小时
发表于 2017-11-24 18:58:48 | 显示全部楼层
将启动文件的heap size设置为0

不做应该也可以,只是nano里面基本不用内存管理,不设为0就是浪费资源。

RT-Thread有自己的内存管理,要用也不用启动代码里面配置的。
同时也可以把libc中默认的malloc指向rt_malloc

如果直接使用libc中的malloc,就是启动文件中设置的那个空间。
但最好做好加锁,不然就确保不会在多个任务中使用。
没有使用RTOS的,请不要在中断里面申请内存(有RTOS的情况下,也不要)。
RT-Thread RTOS 音频,WIFI,蓝牙
回复 支持 反对

使用道具 举报

119

主题

439

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1185
金钱
1185
注册时间
2015-9-18
在线时间
422 小时
 楼主| 发表于 2017-11-24 22:08:39 | 显示全部楼层
本帖最后由 liuchang 于 2017-11-24 22:09 编辑
aozima 发表于 2017-11-24 18:58
不做应该也可以,只是nano里面基本不用内存管理,不设为0就是浪费资源。

RT-Thread有自己的内存管理, ...

的确如大神所言,一般rtos都要求不能在中断中申请动态内存的,rtt也不例外。

我觉得这其中主要有2个原因:
<1>如果是采用链式结构的内存分配算法,如rtt的小内存分配算法,它的时间复杂度是O(n),这个时间是不固定的,违背了rtos的“实时”原则,也同时违背了中断时间尽可能短的原则。
<2>中断可以看作是优先级很高的线程,这里就很容易产生临界资源的问题。所以rtt在分配内存资源时都是采用信号量来进行临界区保护,而在中断中的函数是一定不能是阻塞函数。
电子爱好者
回复 支持 反对

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
发表于 2017-11-25 18:34:21 | 显示全部楼层
牛逼了,我还没弄完了,你这么快就移植好了,666
回复 支持 反对

使用道具 举报

119

主题

439

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1185
金钱
1185
注册时间
2015-9-18
在线时间
422 小时
 楼主| 发表于 2017-11-27 14:38:12 | 显示全部楼层
八度空间 发表于 2017-11-25 18:34
牛逼了,我还没弄完了,你这么快就移植好了,666

请教下八度大神:

rtt会出类似freertos的教程和书籍嘛?
因为感觉rtt相对其它rtos会比较“有趣”(包括它的code style,bsp,finsh shell组件等)。
同时,其中又包含文件系统,lwip,gui等,对我来说,难度不小。

期待原子团队的大作......到时候一定支持下......
电子爱好者
回复 支持 反对

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
发表于 2017-11-27 18:03:42 | 显示全部楼层
liuchang 发表于 2017-11-27 14:38
请教下八度大神:

rtt会出类似freertos的教程和书籍嘛?

你也可以自己弄一个放上来,大家一起来完善,哈哈
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

2

主题

4

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2016-7-1
在线时间
8 小时
发表于 2018-1-12 20:45:25 | 显示全部楼层
github上下载的rt_thread源码不是已经全部移植好了吗,直接在bsp中找到对应分支就可以直接用了呀
回复 支持 反对

使用道具 举报

1

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
150
金钱
150
注册时间
2016-9-22
在线时间
22 小时
发表于 2018-1-31 14:40:57 | 显示全部楼层
Nano堆内存是在rt_hw_board_init()函数中初始化的,
回复 支持 反对

使用道具 举报

1

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
180
金钱
180
注册时间
2014-11-4
在线时间
31 小时
发表于 2018-2-25 19:40:19 | 显示全部楼层
用iar或者keil每次修改rtthread.h重新编译耗时好久,有木有好办法用scons?。。。。。。。。。。
回复 支持 反对

使用道具 举报

27

主题

427

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
4353
金钱
4353
注册时间
2017-5-30
在线时间
577 小时
发表于 2018-3-2 08:37:42 | 显示全部楼层
101MHz 发表于 2018-2-25 19:40
用iar或者keil每次修改rtthread.h重新编译耗时好久,有木有好办法用scons?。。。。。。。。。。

你可以尝试使用ENV工具,来自动生成MDK5工程就可以了
回复 支持 反对

使用道具 举报

11

主题

55

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
327
金钱
327
注册时间
2017-9-10
在线时间
80 小时
发表于 2018-11-19 17:22:52 | 显示全部楼层
你好,那个链接失效了,可以再发一下嘛?谢谢
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-1 07:51

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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