完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
本帖最后由 cyq1993 于 2016-8-3 13:39 编辑 个人觉得FreeRTOS很不错,轻量化、移植很简单、入门快,当时还没接触过任何RTOS时,直接看了个中文版的手册就直接用在STM32上了,没有用过或准备上手入门RTOS的可以试着用用。 因为有蓝牙功能,刚入门了赛普拉斯的CYBL10X6X系列MCU,然后移植 FreeRTOS 备用,在这把移植步骤贴出来,水平不高,希望能帮助刚开始入门的朋友以及和各位交流。 硬件平台: CY8CKIT-042-BLE开发套件 MCU型号: CYBL10563-56LQXI IDE软件: PSoC Creator 3.3 FreeRTOS版本: V8.2.3 (应该是目前最新版V9.0之前的最后一个版本 前面链接是官方下载页)
FreeRTOSV8.2.3.exe.zip
(12.57 MB, 下载次数: 98
)
移植FreeRTOS总体来说就三个步骤:拷贝程序文件、修改中断向量表、配置FreeRTOS 1. 拷贝程序文件 新建或者准备一个无错误的软件工程,下载并解压 FreeRTOSV8.2.3 解压下载的FreeRTOS压缩包,复制 FreeRTOSV8.2.3FreeRTOSSource 下的 list.c queue.c tasks.c timers.c到自己的工程文件目录中,方便起见单独创建一个FreeRTOS的文件夹,再在里面创建名为src和inc的两个文件夹,分别放置 FreeRTOS 的 c文件和 h文件。 croutine.c 和 event_groups.c 没有拷贝,这两个文件实现的功能没用到。前者是协程的实现,一般来说多任务时都是创建任务即task,现在协程用的很少,用在RAM空间非常少的情况下,FreeRTOS好像也停止对croutine.c继续开发了只是没有删除;后者是事件标志组的实现,就是任务可以等待某个事件标志组的到来并根据事件标志组的值去执行不同的操作,比如说0代表第一种情况,1代表第二种情况,2代表第三种……像状态机一样去用。在任务等待某个事件的时候,个人习惯用信号量,event_group在之前的项目中没有用过,具体怎么用也没去学习过。 拷贝 FreeRTOSV8.2.3FreeRTOSSourceportableGCCARM_CM0 中的 port.c 和 portmacro.h 到自己的工程中。这两个文件不同的硬件平台实现不同。PSoC Creator默认用的是GCC编译,所以进入GCC目录,MCU是居于Cortex-M0内核的,因此进入ARM_CM0目录。 拷贝 FreeRTOSV8.2.3FreeRTOSSourceportableMemMang 中的 heap_2.c 到工程中。这是内存管理的实现,一共有5个文件。第一个简单实现了内存的动态申请,就像malloc一样,没有实现内存释放;第二个简单实现了内存的申请和释放,类似malloc和free ,会产生内存碎片;第三个直接将C语言库中的 malloc 和 free 加以修改,使之变成对FreeRTOS来说是线程安全的;第四个在实现了内存的申请和释放的基础上,避免了内存碎片的出现,性能好但是运行开销也大;第五个暂时没去学习过,我没有用内存动态分配的习惯,这里拷贝 heap_2.c 就行了 拷贝 FreeRTOSV8.2.3FreeRTOSSourceinclude 下除 croutine.h、deprecated_definitions.h、event_groups.h 之外的所有 .h 文件到工程。因为没有拷贝 croutine.c和event_groups.c ,对应的 .h文件也不拷贝;deprecated_definitions.h实现了自动调用 portmacro.h,前面手动添加了这个不需要,而且实际使用也不怎么方便。 2. 修改中断向量表 FreeRTOS需要接管 SVC PendSV SVC这三个中断,方法就是将各中断处理函数定位到FreeRTOS提供的处理函数。CYBL10X6X 系列通过CyRamVectors这个数组可以重新改变中断处理函数,CyRamVectors和M0系列的中断向量表是对应的,根据下图就可确定需要修改的三个中断的数组索引分别是 11 14 15 在main.c中包含FreeRTOS头文件:
编写修改中断向量的函数并在 main 函数中最开头调用:
3. 配置FreeRTOS FreeRTOS通过 FreeRTOSConfig.h 来配置内核功能,通过宏定义的方式配置。FreeRTOS提供了很多现成的工程例子,每个工程里面都有配置好的文件,移植一个现成的再根据实际修改很方便。FreeRTOS没有提供CYBL10563的例子,这个芯片是M0内核的,就拷贝了 STM32F0518 的 FreeRTOSConfig.h,目录是 : FreeRTOSV8.2.3FreeRTOSDemoCORTEX_M0_STM32F0518_IAR 接着修改,将下面几个宏改成如下值,其余保持默认:
配置里关闭了所有的HOOK即钩子函数,如果打开就要由用户去实现这些函数,否则编译报错;芯片内核频率要根据实际使用芯片的参数去修改;configTICK_RATE_HZ 定义的是RTOS任务调度时间片的长度,默认是1000太快了,这个其实定义的就是嘀嗒定时器的中断间隔时间。具体的配置资料可以搜索FreeRTOS配置。 由于额外添加了一些 .h 文件,在PSoC Creator 3.3里需要对工程设置以下,将工程目录下的头文件目录告诉IDE,右击工程选择 Build Settings... ,在如下地方设置目录,根据实际设置即可,和 keil 类似。 编译一下,由于没有把 deprecated_definitions.h 文件拷贝过来,报了个错: 把这句注释掉就行了,再编译下,到此FreeRTOS就移植好了,可以创建任务运行了。我在工程里创建了两个亮灯的任务,分别以1S间隔闪烁红灯和绿灯,经过测试可以运行。下面是我的工程:
_FreeRTOS.zip
(2.06 MB, 下载次数: 269
)
|
|
相关推荐
3 个讨论
|
|
深度好文章, 正好用的上. 多谢!
|
|
|
|
|
|
只有小组成员才能发言,加入小组>>
752个成员聚集在这个小组
加入小组2070 浏览 1 评论
1826 浏览 1 评论
3639 浏览 1 评论
请问可以直接使用来自FX2LP固件的端点向主机FIFO写入数据吗?
1761 浏览 6 评论
1513 浏览 1 评论
CY8C4025LQI在程序中调用函数,通过示波器观察SCL引脚波形,无法将pin0.4(SCL)下拉是什么原因导致?
510浏览 2评论
CYUSB3065焊接到USB3.0 TYPE-B口的焊接触点就无法使用是什么原因导致的?
360浏览 2评论
CX3连接Camera修改分辨率之后,播放器无法播出camera的画面怎么解决?
410浏览 2评论
357浏览 2评论
使用stm32+cyw43438 wifi驱动whd,WHD驱动固件加载失败的原因?
857浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-23 21:45 , Processed in 1.027824 second(s), Total 69, Slave 53 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号