完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
公司项目原先使用μCOS-II,但是μCOS存在商业使用付费问题,故而我们转向用国产开源免费RTOS RT-Thread替代,花了一天半的时间将原来的μCOS代码移植到了RT-Thread上面。下面分享下移植方法和API对应表两部分讲下方法。一、移植方法软件环境:Win7+MDK5.18.0硬件环境:STM32F1031.从GitHub下载RT-Thread源码:https://github.com/RT-Thread/rt-thread;2.将1步骤下载的源码打开,目录如下:
其中bsp目录下面,可以看到很多开发板工程目录,如下图: |
|
相关推荐
11个回答
|
|
谢谢分享
|
|
|
|
项目主控是stm32f1系列的,选择stm32f10x这个目录下的工程作为基础版本。
3.基础工程框架下,将我们原有的工程文件添加进来,除去μCOS-II相关源码。 原来基于μCOS-II的相关源码目录如下: os_cfg.h:μCOS-II系统相关的一些宏开关定义(如是否使能事件、mailbox、信号量及队列等)、系统参数定义(如每秒tick数、任务栈大小定义等),对应RT-Thread里面的rtconfig.h。 这个目录下面是与处理器相关的代码,os_cpu_a.asm 文件通过 Thumb2 指令实现的一些中断服务函数等,例如 voidOS_CPU_PendSVHandler(void) 处理上下文切换异常等;对应到RT-Thread里面的context_rvds.S 这个文件。os_cpu_c.c文件实现任务栈初始化和一些钩子函数(如空闲任务和systick等),对应到RT-Thread里面的 cpuport.c。 需要说明的是启动文件context_rvds.S里面定义了两个中断服务函数跟stm32f10x_it.c里面是重复的,分别是HardFault_Handler和PendSV_Handler,移植的时候需要屏蔽掉stm32f10x_it.c里面相应的部分。 这个目录下是与处理器无关的文件,对应RT-Thread根目录下src里面的内容。 在移植的时候,先将以上与μCOS-II相关的源码全部删除,把我们工程其他源码放在 bspstm32f10xsrc 这个路径下,keil工程建立在 bspstm32f10x 这里。 Keil工程目录如下:
4.使用RTT的接口修改掉原来的一些系统调用,具体如下:
|
|
|
|
后面的晚点再编辑
|
|
|
|
收藏一下,感谢分享
|
|
|
|
收藏了
|
|
|
|
5. 任务的创建与删除
RT-Thread的任务管理分静态方法和动态方法,静态方法: 只能调用静态方法删除任务: 动态方法: 只能调用动态方法删除任务: rt_err_t rt_thread_delete(rt_thread_tthread); 其他诸如SPI等驱动及事件、信号量等处理不再赘述。 |
|
|
|
二、μCOS-II与RT-Thread API对应表:(左侧μCOS-Ⅱ,右侧RT-Thread)任务创建与删除: 任务挂起与恢复
操作系统进入/退出“临界区”的功能代码: ENTER ISROSIntEnter ();rt_interrupt_enter();OSIntExit ();rt_interrupt_leave(); 任务优先级:μC/OS-Ⅱ和RT-Thread都是值越小优先级越高,但优先级数不同,μC/OS-Ⅱ支持最多64级,RT-Thread支持最多256级。 任务延时:事件:μC/OS-Ⅱ RT-Thread整个移植过程就这样,最后谈下RT-Thread。接触RT-Thread之后,个人还是蛮喜欢的,入门很快,编码风格很好。它是一个分层的操作系统,有丰富的系统组件,例如LwIP轻型TCP/IP协议栈、文件系统等,使用方便。 开发过程中对RT-Thread与μCOS最大的不同体验一个是在RT-Thread中的静态和动态方法的区分,另一个是内存安全性方面。以前项目跑在μCOS上很多double free的问题,μCOS不做任何警告,完全看不出来有什么问题,只是时间久了,系统复位;移植到RT-Thread上之后double free系统会assert,一次性解决了好些bug。 |
|
|
|
二、μCOS-II与RT-Thread API对应表:(左侧μCOS-Ⅱ,右侧RT-Thread)任务创建与删除:OSInit(&err);初始化μC/OS-Ⅱ,对这个函数的调用必须在调用OSStart()函数之前。分动态和静态方法,动态方法:rt_thread_create();rt_thread_delete();静态方法:rt_thread_init();rt_thread_detach();OSTaskCreate();OSTaskDel();OSStart();真正开始运行多任务。rt_thread_startup(tid);
任务挂起与恢复OSTaskSuspend();rt_thread_suspend(tid);OSTaskResume ();rt_thread_resume (tid); 操作系统进入/退出“临界区”的功能代码:OS_ENTER_CRITICAL();rt_enter_critical ();OS_EXIT_CRITICAL();rt_exit_critical (); ENTER ISROSIntEnter ();rt_interrupt_enter();OSIntExit ();rt_interrupt_leave(); 任务优先级:μC/OS-Ⅱ和RT-Thread都是值越小优先级越高,但优先级数不同,μC/OS-Ⅱ支持最多64级,RT-Thread支持最多256级。 任务延时:OSTimeDly();延时ticksrt_thread_delay ();延时ticksOSTimeDlyHMSM ();延时(时 分 秒 毫秒) 事件:μC/OS-Ⅱ功能信号量互斥信号量事件标志组消息邮箱消息队列建立事件OSSemCreate();OSMutexCreate();OSFlagCreate();OSMboxCreate();OSQCreate();删除事件OSSemDel ();OSMutexDel ();OSFlagDel ();OSMboxDel ();OSQDel ();等待事件OSSemPend();OSMutexPend();OSFlagPend();OSMboxPend();OSQPend();发送事件OSSemPost();OSMutexPost();OSFlagPost();OSMboxPost();OSQPost();无等待获得事件OSSemAccept();OSMutexAccept();OSFlagAccept();OSMboxAccept();OSQAccept();查询事件状态OSSemQuery();OSMutexQuery();OSFlagQuery();OSMboxQuery();OSQQuery(); RT-Thread功能信号量互斥信号量事件标志组消息邮箱消息队列建立事件静态方法:rt_sem_init();动态方法:rt_sem_create();静态方法:rt_mutex_init ();动态方法:rt_mutex_create ();静态方法:rt_event_init ();动态方法:rt_event_create ();静态方法:rt_mb_init ();动态方法:rt_mb_create ();静态方法:rt_mq_init ();动态方法:rt_mq_create ();删除事件静态方法:rt_sem_detach();动态方法:rt_sem_delete();静态方法:rt_mutex_detach ();动态方法:rt_mutex_delete ();静态方法:rt_event_detach ();动态方法:rt_event_delete ();静态方法:rt_mb_detach ();动态方法:rt_mb_delete ();静态方法:rt_mq_detach ();动态方法:rt_mq_delete ();等待事件rt_sem_take();rt_mutex_take();rt_event_recv();rt_mb_recv();rt_mq_recv();发送事件rt_sem_release();rt_mutex_release();rt_event_send();rt_mb_send_wait();rt_mq_send();rt_mq_urgent();无等待获得事件rt_sem_trytake();rt_mb_send();查询事件状态其他rt_sem_control();执行cmd,目前函数里面只有一个RT_IPC_CMD_RESET实现rt_mutex_control();目前函数直接返回err:return -RT_ERROR;rt_event_control();执行cmd,目前函数里面只有一个RT_IPC_CMD_RESET实现rt_mb_control();执行cmd,目前函数里面只有一个RT_IPC_CMD_RESET实现rt_mq_control();执行cmd,目前函数里面只有一个RT_IPC_CMD_RESET实现 整个移植过程就这样,最后谈下RT-Thread。接触RT-Thread之后,个人还是蛮喜欢的,入门很快,编码风格很好。它是一个分层的操作系统,有丰富的系统组件,例如LwIP轻型TCP/IP协议栈、文件系统等,使用方便。 开发过程中对RT-Thread与μCOS最大的不同体验一个是在RT-Thread中的静态和动态方法的区分,另一个是内存安全性方面。以前项目跑在μCOS上很多double free的问题,μCOS不做任何警告,完全看不出来有什么问题,只是时间久了,系统复位;移植到RT-Thread上之后double free系统会assert,一次性解决了好些bug。 |
|
|
|
这个帖子要火
|
|
|
|
感谢分享,收藏了
|
|
|
|
我不得不说你写的好
|
|
|
|
只有小组成员才能发言,加入小组>>
674 浏览 0 评论
1098 浏览 1 评论
2463 浏览 5 评论
2794 浏览 9 评论
移植了freeRTOS到STMf103之后显示没有定义的原因?
2632 浏览 6 评论
使用eim外接fpga可是端口一点反应都没有有没有大哥指点一下啊
644浏览 9评论
640浏览 7评论
请教大神怎样去解决iMX6Q在linux3.0.35内核上做AP失败的问题呢
771浏览 6评论
615浏览 5评论
659浏览 5评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-14 19:19 , Processed in 1.156406 second(s), Total 99, Slave 79 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号