0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

RT-Thread操作系统的FreeRTOS兼容层

RTThread物联网操作系统 来源:未知 2023-01-14 00:55 次阅读

Github地址

https://github.com/RT-Thread-packages/FreeRTOS-Wrapper

期待您的Star

本项目是2022年开源之夏,RT-Thread社区项目。已经于2022年9月由唐照洲(美国佐治亚理工学院,大四)顺利结项完成。FreeRTOS兼容层目前已经落地到RT-Thread对ESP32-IDF(唐照洲)和core-v-mcu(王顺)两款SDK的兼容项目中。


1 概述


这是一个针对RT-Thread国产操作系统的FreeRTOS操作系统兼容层,可以让原有基于FreeRTOS操作系统的项目快速、无感地迁移到RT-Thread操作系统上,实现在RT-Thread操作系统上无感的使用FreeRTOS的API,同时可以使用RT-Thread的丰富组件。项目基于FreeRTOS V10.4.6版本。

1.1 RT-Thread的其他RTOS兼容层

  • RT-Thread操作系统的μCOS-III兼容层:https://github.com/mysterywolf/RT-Thread-wrapper-of-uCOS-III

  • RT-Thread操作系统的μCOS-II兼容层:https://github.com/mysterywolf/RT-Thread-wrapper-of-uCOS-II

  • RT-Thread操作系统的RTX(即CMSIS-RTOS1)兼容层:https://github.com/RT-Thread-packages/CMSIS_RTOS1

  • RT-Thread操作系统的RTX5(即CMSIS-RTOS2)兼容层:https://github.com/RT-Thread-packages/CMSIS_RTOS2

  • RT-Thread操作系统的Arduino生态兼容层:https://github.com/RTduino/RTduino

2 FreeRTOS的API支持情况及使用注意事项


API支持情况详见,readme 链接如下:

https://github.com/RT-Thread-packages/FreeRTOS-Wrapper

(请复制至外部浏览器打开)

兼容层对FreeRTOS的支持情况记录在issue中记录。一些支持的函数在功能和使用方法上和FreeRTOS略有不同,在迁移过程中需要注意。

2.1线程、消息队列与互斥量

2.1.1 vTaskSuspend

vTaskSuspend只支持挂起当前运行的线程,在使用时xTaskToSuspend参数必须为NULL。否则会触发断言。

2.1.2 xQueueSendToFront

xQueueSendToFront不支持设置超时,使用时xTicksToWait参数会被忽略,消息队列没有空间时会立即返回errQUEUE_FULL

2.1.3 xQueueCreateStatic

静态消息队列需要参考以下的例子创建,确保为消息队列分配的内存足够大:

 1#defineQUEUE_LENGTH10
 2#defineITEM_SIZEsizeof(uint32_t)
 3
 4/*以下是在原版FreeRTOS分配内存的方法,由于RT-Thread消息队列内部的实现与FreeRTOS不同,这样分配的内存不够存放ITEM_SIZE个消息*/
 5//uint8_tucQueueStorage[QUEUE_LENGTH*ITEM_SIZE];
 6/*要使用QUEUE_BUFFER_SIZE宏分配内存*/
 7uint8_tucQueueStorage[QUEUE_BUFFER_SIZE(QUEUE_LENGTH,ITEM_SIZE)];
 8StaticQueue_txQueueBuffer;
 9QueueHandle_txQueue1;
10xQueue1=xQueueCreate(QUEUE_LENGTH,ITEM_SIZE,&(ucQueueStorage[0]),&xQueueBuffer);

2.1.4 Mutex和Recursive Mutex

FreeRTOS提供了两种互斥量,Mutex和Recursive Mutex。Recursive Mutex可以由同一个线程重复获取,Mutex不可以。RT-Thread提供的互斥量是可以重复获取的,因此兼容层也不对Mutex和Recursive Mutex做区分。

用xSemaphoreCreateMutex和xSemaphoreCreateRecursiveMutex创建的互斥量都是可以重复获取的。

2.2 定时器

和FreeRTOS不同,RT-Thread不使用一个消息队列向定时器线程传递命令。使用兼容层时任何需要设置超时的定时器函数,如xTimerStart( xTimer, xTicksToWait )xTicksToWait参数会被忽略,函数会立即完成命令并返回。

2.3 FromISR函数

FreeRTOS为一些函数提供了在中断中使用的FromISR版本,如果这些函数唤醒了更高优先级的线程,需要手动调度,如下所示:

1BaseType_txHigherPrioritTaskWoken=pdFALSE;
2xQueueSendToFrontFromISR(xRxQueue,&cIn,&xHigherPriorityTaskWoken);
3if(xHigherPriorityTaskWoken)
4{
5taskYIELD();
6}

RT-Thread不为函数提供FromISR版本,函数可以在中断调用并在内部完成调度。因此在兼容层中使用FromISR函数后不需要手动调度,xHigherPriorityTaskWoken总会被设置成pdFALSE

2.4 内存堆

兼容层保留了FreeRTOS的五种内存分配算法,默认使用heap_3pvPortMalloc/vPortFree内部调用RT_KERNEL_MALLOC/RT_KERNEL_FREE在RT-Thread内部的内存堆分配。这种情况下内存堆的大小由RT-Thread BSP配置决定,无法在FreeRTOSConfig.h中通过configTOTAL_HEAP_SIZE设置。若使用其他算法,需要修改FreeRTOS/sSConscript,选择相应的源文件

1#可将heap_3.c替换成heap_1.c等
2src+=Glob(os.path.join("portable","MemMang","heap_3.c"))

FreeRTOS/portable/rt-thread/FreeRTOSConfig.h中通过configTOTAL_HEAP_SIZE设置内存堆大小。应用调用pvPortMalloc/vPortFree会在一块独立于RT-Thread,大小为configTOTAL_HEAP_SIZE的内存堆中分配,RT-Thread内部的内存堆仍然存在,兼容层函数内部分配内存都在RT-Thread的内存堆完成。

2.5 线程优先级

RT-Threa线程优先级数值越小时优先级越高,而FreeRTOS线程优先级数值越大优先级越高。在使用兼容层的FreeRTOS API,如xTaskCreate,使用FreeRTOS的规则为线程指定优先级即可。若在应用中将RT-Thread和FreeRTOS API混合使用,在指定线程优先级时要特别注意。可以使用以下两个宏对RT-Thread和FreeRTOS线程优先级做转换:

1#defineFREERTOS_PRIORITY_TO_RTTHREAD(priority)(configMAX_PRIORITIES-1-(priority))
2#defineRTTHREAD_PRIORITY_TO_FREERTOS(priority)(RT_THREAD_PRIORITY_MAX-1-(priority))

2.6 线程堆栈大小

FreeRTOS线程堆栈大小的单位为sizeof(StackType_t),RT-Thread线程堆栈大小为sizeof(rt_uint8_t)。使用FreeRTOS API创建线程时一定要遵守FreeRTOS的规则,切勿混淆。

2.7 vTaskStartScheduler

由于RT-Thread和FreeRTOS的内核启动流程不同,使用兼容层时,main函数是在一个线程中运行,该线程优先级为CONFIG_RT_MAIN_THREAD_PRIORITY。(此选项通过SCons配置,数值越小优先级越高。),此时调度器已经开启。一般的FreeRTOS应用采用以下的方式创建线程:

1xTaskCreate(pxTask1Code,......);
2xTaskCreate(pxTask2Code,......);
3......
4vTaskStartScheduler();

使用兼容层时,任何使用xTaskCreate创建的线程若优先级比CONFIG_RT_MAIN_THREAD_PRIORITY更高,会立即开始执行。vTaskStartScheduler只是为了提供对应用的兼容,没有任何实际效果。在使用兼容层时,创建线程要特别注意,确保在调用xTaskCreate时,该线程所需的所有资源已经完成初始化,可以正常运行。

3 使用方法


通过Env工具将兼容层加入到工程中:

1RT-Threadonlinepackages
2systempackages--->
3[*]FreeRTOSWrapper--->
4Version(latest)

使用scons --menuconfig配置RT-Thread内核,以下选项会影响到FreeRTOS兼容层:

1RT_USING_TIMER_SOFT/*使用FreeRTOS定时器时必须开启*/
2RT_TIMER_THREAD_PRIO/*定时器线程优先级。与FreeRTOS相反,该选项数值越小优先级越高*/
3RT_TIMER_THREAD_STACK_SIZE/*定时器线程栈大小,单位为sizeof(rt_uint8_t)*/
4RT_USING_MUTEX/*使用FreeRTOS互斥量时必须开启*/
5RT_USING_SEMAPHORE/*使用FreeRTOS信号量时必须开启*/
6RT_USING_HEAP/*使用FreeRTOS动态内存分配时必须开启*/
7RT_TICK_PER_SECOND/*相当于FreeRTOSconfigTICK_RATE_HZ*/
8RT_THREAD_PRIORITY_MAX/*相当于FreeRTOSconfigMAX_PRIORITIES*/
9RT_NAME_MAX/*相当于FreeRTOSconfigMAX_TASK_NAME_LEN*/

FreeRTOS/portable/rt-thread提供了FreeRTOSConfig.h模版。大部分内容不可以修改或依赖RT-Thread内核的配置,可以手动修改的内容如下:

 1/*可以选择不使用recursivemutex*/
 2#ifdefRT_USING_MUTEX
 3#defineconfigUSE_RECURSIVE_MUTEXES1
 4#defineconfigUSE_MUTEXES1
 5#endif
 6
 7/*可以选择不使用countingsemaphore*/
 8#ifdefRT_USING_SEMAPHORE
 9#defineconfigUSE_COUNTING_SEMAPHORES1
10#endif
11
12/*若不使用heap_3,可以通过configTOTAL_HEAP_SIZE配置内存堆大小*/
13#defineconfigSUPPORT_STATIC_ALLOCATION1
14#ifdefRT_USING_HEAP
15#defineconfigSUPPORT_DYNAMIC_ALLOCATION1
16#defineconfigTOTAL_HEAP_SIZE10240
17#defineconfigAPPLICATION_ALLOCATED_HEAP0
18#endif
19
20#defineconfigMINIMAL_STACK_SIZE128
21
22/*可以选择的函数和功能*/
23#defineINCLUDE_vTaskPrioritySet1
24#defineINCLUDE_uxTaskPriorityGet1
25#defineINCLUDE_vTaskDelete1
26#defineINCLUDE_vTaskSuspend1
27#defineINCLUDE_xTaskDelayUntil1
28#defineINCLUDE_vTaskDelay1
29#defineINCLUDE_xTaskGetIdleTaskHandle1
30#defineINCLUDE_xTaskAbortDelay1
31#defineINCLUDE_xSemaphoreGetMutexHolder1
32#defineINCLUDE_xTaskGetHandle1
33#defineINCLUDE_uxTaskGetStackHighWaterMark1
34#defineINCLUDE_uxTaskGetStackHighWaterMark21
35#defineINCLUDE_eTaskGetState1
36#defineINCLUDE_xTaskResumeFromISR1
37#defineINCLUDE_xTaskGetSchedulerState1
38#defineINCLUDE_xTaskGetCurrentTaskHandle1
39#defineconfigUSE_APPLICATION_TASK_TAG1
40#defineconfigUSE_TASK_NOTIFICATIONS1
41#defineconfigTASK_NOTIFICATION_ARRAY_ENTRIES3

在test目录下提供了一些例程,可以将它们加入BSP目录下的applications文件夹中。使用SCons编译并烧录后,可以连接串口,输入相应的msh命令,观察例程的执行结果:

 1msh/>queue_dynamic
 2Task1receivedata0fromqueue
 3Task1receivedata1fromqueue
 4Task1receivedata2fromqueue
 5Task1receivedata3fromqueue
 6Task1receivedata4fromqueue
 7Task1receivedata5fromqueue
 8Task1receivedata6fromqueue
 9Task1receivedata7fromqueue
10Task1receivedata8fromqueue
11Task1receivedata9fromqueue
12Task1receivedata10fromqueue

4 参考资料


RT-Thread文档

https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/README

FreeRTOS文档

https://www.freertos.org/a00106.html


Github地址

https://github.com/RT-Thread-packages/FreeRTOS-Wrapper

期待您的Star

———————End———————

你可以添加微信:rtthread2020 为好友,注明:公司+姓名,拉进RT-Thread官方微信交流群!

fae593d8-9362-11ed-bfe3-dac502259ad0.gif


原文标题:RT-Thread操作系统的FreeRTOS兼容层

文章出处:【微信公众号:RTThread物联网操作系统】欢迎添加关注!文章转载请注明出处。


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • RT-Thread
    +关注

    关注

    31

    文章

    1272

    浏览量

    39908

原文标题:RT-Thread操作系统的FreeRTOS兼容层

文章出处:【微信号:RTThread,微信公众号:RTThread物联网操作系统】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    RT-Thread联合河北大学发起嵌入式操作系统专业班-保定站

    RT-Thread官方将在11月23至24日河北省保定市(河北大学)发起为期两天的嵌入式操作系统专业培训班暨RT-Thread师资培训!本次培训将会深入讲解RT-Thread嵌入式实时
    的头像 发表于 11-16 01:09 110次阅读
    <b class='flag-5'>RT-Thread</b>联合河北大学发起嵌入式<b class='flag-5'>操作系统</b>专业班-保定站

    【本周六-深圳】RT-Thread嵌入式操作系统专业培训班正式开班

    RT-Thread官方在本周六将发起为期三天的嵌入式操作系统专业培训班!本次培训将会深入讲解RT-Thread嵌入式实时操作系统的核心概念、实战技巧和应用场景!无论企业团队/工程师是刚
    的头像 发表于 11-08 01:07 150次阅读
    【本周六-深圳】<b class='flag-5'>RT-Thread</b>嵌入式<b class='flag-5'>操作系统</b>专业培训班正式开班

    新书发布——《RT-Thread嵌入式实时操作系统内核、驱动和应用开发技术》

    我们非常高兴地宣布,由郑苗秀、沈鸿飞和廖建尚编著的《RT-Thread嵌入式实时操作系统内核、驱动和应用开发技术》一书正式发布。本书的编写团队由多位在嵌入式和实时操作系统领域有着丰富经验的专家组
    的头像 发表于 09-03 08:06 470次阅读
    新书发布——《<b class='flag-5'>RT-Thread</b>嵌入式实时<b class='flag-5'>操作系统</b>内核、驱动和应用开发技术》

    【好书推荐】RT-Thread设备驱动开发指南

    近年来国内芯片产业和物联网产业的快速崛起,行业发展迫切需要更多人才,尤其需要掌握嵌入式操作系统等底层技术的人才。随着RT-Thread被更广泛地应用于行业中,开发者对嵌入式驱动开发的需求越来越
    的头像 发表于 08-01 08:35 514次阅读
    【好书推荐】<b class='flag-5'>RT-Thread</b>设备驱动开发指南

    RT-Thread内部机制大揭秘,带你深入操作系统内核

    一、RT-Thread概述RT-Thread是一款具有显著优势的开源嵌入式实时操作系统。它不仅具备轻量级、实时性强的特点,还拥有广泛的开源社区支持和丰富的应用场景。在轻量级方面,RT-Thre
    的头像 发表于 08-01 08:11 3013次阅读
    <b class='flag-5'>RT-Thread</b>内部机制大揭秘,带你深入<b class='flag-5'>操作系统</b>内核

    睿赛德科技CEO熊谱翔 ——基于RT-Thread操作系统的安全车控系统实践

    操作系统非常看重生态,RT-ThreadSafetyAuto操作系统也是这样,通过兼容开源RT-Thread
    的头像 发表于 07-13 08:35 1348次阅读
    睿赛德科技CEO熊谱翔 ——基于<b class='flag-5'>RT-Thread</b><b class='flag-5'>操作系统</b>的安全车控<b class='flag-5'>系统</b>实践

    如何在FreeRTOS操作系统上跑RT-Thread

    我现在有个项目用的MCU 内核是很小众的,芯片厂家仅支持freertos,我现在想把rt-thread弄上去跑,不知道该怎么实现开关中断以及上下文切换等,能提供帮助吗? 底层继续使用freertos,我在应用中使用
    发表于 07-09 08:30

    RT-Thread 新里程碑达成——GitHub Star 破万!

    RT-Thread实时操作系统开源项目在GitHub上的star数量突破一万!截止发文,RT-Thread作为实时操作系统在业界Star数量排名第一!仓库地址:https://gith
    的头像 发表于 07-04 08:35 393次阅读
    <b class='flag-5'>RT-Thread</b> 新里程碑达成——GitHub Star 破万!

    基于 RT-Thread专业版的EtherCAT主站方案

    特点。在RT-Thread实时操作系统上运行EtherCAT主站协议,大大提高了实时性,极大降低了循环同步抖动时间,可满足各种对实时性要求苛刻的应用场景。以下是在瑞
    的头像 发表于 06-19 08:35 792次阅读
    基于 <b class='flag-5'>RT-Thread</b>专业版的EtherCAT主站方案

    开发者分享 | 基于先楫RT-Thread BSP,使用CLion开发应用

    ,搭载RT-Thread实时操作系统,使用RT-ThreadStudio进行开发。RT-Thread是一个伟大的操作系统,但是,
    的头像 发表于 06-07 08:17 2641次阅读
    开发者分享 | 基于先楫<b class='flag-5'>RT-Thread</b> BSP,使用CLion开发应用

    实时操作系统RT-ThreadFreeRTOS

    RT-Thread与其他很多RTOS如FreeRTOS的主要区别之一是,它不仅仅是一个实时内核,还具备丰富的中间层组件,如下图所示。FreeRTOSRT-Thread是两种常见的嵌入
    的头像 发表于 05-29 08:10 3567次阅读
    实时<b class='flag-5'>操作系统</b>之<b class='flag-5'>RT-Thread</b>及<b class='flag-5'>FreeRTOS</b>

    新书发布——《实时操作系统应用技术:RT-Thread与ARM编程实践》

    RT-Thread又一本新书《实时操作系统应用技术——基于RT-Thread与ARM的编程实践》发布,标志着RT-Thread生态和实时操作系统
    的头像 发表于 05-11 08:35 729次阅读
    新书发布——《实时<b class='flag-5'>操作系统</b>应用技术:<b class='flag-5'>RT-Thread</b>与ARM编程实践》

    RT-Thread荣获“最具影响力IoT操作系统奖”

    2024年3月30日,第十一届开源操作系统年度技术会议(OS2ATC)在西郊宾馆举办!RT-Thread作为国内领先的开源操作系统斩获了“最具影响力IoT操作系统奖”。该奖项是对
    的头像 发表于 04-12 08:37 399次阅读
    <b class='flag-5'>RT-Thread</b>荣获“最具影响力IoT<b class='flag-5'>操作系统</b>奖”

    RT-Thread斩获“最具影响力IoT操作系统奖”

    2024年3月30日,第十一届开源操作系统年度技术会议(OS2ATC)在西郊宾馆举办!RT-Thread作为国内领先的开源操作系统斩获了“最具影响力IoT操作系统奖”。
    的头像 发表于 04-10 09:51 550次阅读

    rt-thread如何实现与freertos相同的功能?

    我在一个项目中采用了 cortex m4 的内核,用于 pwm 控制电机,对定时器的实时性要求比较高,希望 rt-thread 在进行原子操作时不关闭 pwm 的定时器。 当前 rt-thread
    发表于 02-22 07:20