最近为实现小应用囤了一点尚属低价的STM32F030C8T6单片机,自制了最小系统板,也就顺带捣鼓在这种小芯片上如何移植FreeRTOS。其实由于这款单片机SRAM容量太小,再上FreeRTOS有点不划算了,但这个移植的过程却对入门FreeRTOS很有帮助。

工具链:Keil MDK 5.34 + STM32CubeMX 6.3.0 + 自制最小系统板(如图)

一、配置管脚+生成代码

打开Keil,选择单片机(我这里就选STM32F030C8T6),接着在Manage Run-Time Environment中选择软件组件,选中CMSIS->CORE、Device->STM32CubeHAL、Device->Startup以及下面STM32Cube Framework (API)里的STM32CubeMX。注意,不要马上点击确定!!!

我们先要点STM32CubeMX旁边的绿色启动按钮,启动CubeMX配置。CubeMX要从意法半导体官网下载安装。

作为一个简单的例子,我们可以只配置最少的管脚,并且只用片内振荡器。我在PC13上挂了一个LED,将该管脚配置为GPIO_Output,然后启用USART1,配置为异步(UART)模式,波特率115200Bits/s。默认条件下,PA9被设置为TX,PA10为RX。
(配置GPIO和UART)

接着我们用STM32CubeMX生成FreeRTOS的代码。左侧目录中点开Middleware,就有FreeRTOS,点中它,接口(Interface)选择CMSIS_V2。在下面设置参数中内存管理里,设置总堆大小(TOTAL_HEAP_SIZE)为2048字节,内存管理方法(Memory Management scheme)为heap_1。
(配置FreeRTOS)

这里我们插句嘴,说明一下我们在设置什么。尽管我们要用FreeRTOS,ARM为Cortex M系列的芯片还另外开发了一套API,就是CMSIS,这样,即使内核操作系统不同,在用户级的代码却可以共享同一套API,降低了代码移植的难度。待会我们也可以看到,我们是用CMSIS的API创建任务线程,而非直接用FreeRTOS的API;但本质上,只是一层封装,最后还是要调用FreeRTOS的API的。

内存管理是这里的关键。FreeRTOS提供了多种内存管理方式,我们这次就用最简单的Heap_1,它只支持malloc,不支持free,也就是说建立线程之后,即使要删除该线程,也没法释放其资源,但对我们已经足够。

接着我们点Tasks and Queues选项卡,去创建任务。这里面已经有一个defaultTask,我把它改名Task1,并把入口函数改名task1fxn;再创建第二个任务task2,入口函数task2fxn。

现在我们看一下FreeRTOS Heap Usage,可以看到每个任务都占了632字节的RAM,堆栈还剩784字节。

至此,其实STM32CubeMX中的设置已经基本完毕。点击GENERATE CODE,它给出提示,在使用RTOS时,强烈建议改用HAL Timebase Source而非直接用Systick。这里我暂时不知道为什么,不过为了尽快拉通,就按它说的做,把Timebase Source改为TIM1。然后生成代码,退出STM32CubeMX,在Keil中Manage Run-Time Environment点击OK。

二、FreeRTOS代码加入工作区

此时代码已经生成,但FreeRTOS的代码却还没加进来。在Project栏中,为我们的工程加入几个分组:CMSIS_V2、FreeRTOS_src和FreeRTOS_inc。命名并不一定如此,只是看着方便。然后找到生成的FreeRTOS代码,在(工程目录)\RTE\Device\STM32F030C8Tx\ STCubeGenerated\Middlewares\Third_Party\FreeRTOS\Source中(对的,非常深)。

其中,CMSIS_RTOS_V2文件夹下定义的就是CMSIS_V2的API,加入CMSIS_V2分组中;这个目录下所有.c文件都是FreeRTOS的代码,加入FreeRTOS_src分组;…/protable/MemMang文件夹下是FreeRTOS的5种内存管理方式源代码,我们采用Heap_1,就把heap_1.c加入FreeRTOS_src,别的不管;接着在…/protable/RVDS/ARM_CM0下是与硬件接口相关的代码,prot.c加入FreeRTOS_src,portmacro.h加入FreeRTOS_inc,再把…/include文件夹下的所有.h文件都加入FreeRTOS中。最后,在编译器选项中把包含了FreeRTOS头文件的3个文件夹加入Include Paths。


此时配置本该成功了,可以编译一次,却编译错误,所有错误都来自port.c。原来,这个接口代码有大量的c语言中嵌套汇编的操作,这些汇编指令编译器都没有被正确识别。查询网上的信息,似乎老版本的MDK编译器还是可以编译这些代码的,STM32CubeMX却还是按老版本生成代码的,但最新的反而不支持了。

此时我猜想,Keil应该是把自己的编译器变得更“标准”导致无法编译的。那什么是最标准的代码呢?当然是GCC能编译的代码就是最标准的代码啦~从网络上下载到FreeRTOSv10.0.1的官方代码,其中portable文件夹就有十几种编译器的代码,包含GCC,用GCC/ARM_CM0的port.c和portmacro.h替换我们工程下的接口,再编译,果然成功。

三、线程代码编写

为了有比较明显的实验现象,我在main.c编写了一个串口输出函数:

void UART_print(UART_HandleTypeDef *huart, uint8_t *pData)
{uint16_t len = 0;while (pData[len]) len++;HAL_UART_Transmit(huart, pData, len, 0x7fff); // enough time to transmit
}

以及两个线程的函数:

void task1_fxn(void *argument)
{/* Infinite loop */for(;;){osDelay(1000); // delay 1000msUART_print(&huart1,"task1: Hello world\n\r");HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_13);}
}
void task2_fxn(void *argument)
{/* Infinite loop */for(;;){osDelay(1000); // delay 1000msUART_print(&huart1,"task2: Hello world\n\r\n\r");}
}

在task1中,我们不仅串口输出,还改变GPIO的电平;task2中,则会换行两次方便识别。osDelay()就是CMSIS的API,提供类似sleep的进程挂起作用,延迟单位是ms。接上串口,看到串口输出数据,表明FreeRTOS已经正常启动,且两个线程被轮流调用了,移植成功。

为STM32F0搭建FreeRTOS实录相关推荐

  1. ff14显卡测试软件,最终幻想14首台4K电脑环境搭建测试实录

    备受期待的<最终幻想14>终于要来了!盛大游戏"最终幻想的水晶之旅"首站发布会将于2月25日在上海中环金逸4K影院召开,制作人吉田直树先生也将亲临现场与玩家互动,并通过 ...

  2. windows中freeRTOS模拟器环境搭建

    windows中的freeRTOS使用   FreeRTOS参考手册中的模拟程序都是基于windows版本的模拟器.因此为了学习FreeRTOS,需要在Windows中搭建一下模拟器的运行环境.网络上 ...

  3. React+Redux开发实录(一)搭建工程脚手架

    React+Redux开发实录(一)搭建工程脚手架 React+Redux开发实录(二)React技术栈一览 搭建工程脚手架 准备工作 安装node 安装git 安装一款前端IDE 推荐VSCode, ...

  4. 探臻实录 | 戴琼海:搭建脑科学与人工智能的桥梁

    来源:探臻科技评论 人工智能作为21世纪最具有影响力的技术,正在包括诸如机器人.语言识别.图像识别.自然语言处理等诸多领域发挥着重要作用.脑科学被誉为"人类科学最后的前沿",认识脑 ...

  5. 电子商城实录------项目目录的结构搭建及其说明3

    <电子商城实录------项目目录的结构搭建及其说明2>中方法优化 Framework.class.php代码加入static: <?php //核心启动类 class Framew ...

  6. python环境设置_CentOS 7.2环境搭建实录(第四章:python环境配置)

    第四章:python环境配置 使用环境工具 python 环境工具 python 2.7.5 # python2版本,系统自带 pip 9.0.1 # python2版本的pip,python工具集, ...

  7. 演进实录|不同阶段的企业如何搭建监控体系?

    *作者|涯海 审核&校对:白玙 编辑&排版:雯燕* 在陪伴众多企业共同经历业务上云与云上原生之后,我们可以看到每个企业的运维监控体系搭建过程都十分艰辛.这是由于企业业务发展迅速,对 I ...

  8. Nexus【环境搭建 01】CentOS 7.5 环境下搭建私有Maven仓库实录(启动问题处理+安装文件 nexus-3.4.0-02-unix.tar.gz 云盘链接)

    1. 为什么要搭建私有Maven仓库   废话少说,只说主要原因,我现在参与的项目各个模块都是以微服务形式进行部署的,包括权限验证模块,我之前参与过一个项目,使用的是自己封装的权限验证setter依赖 ...

  9. [vSphere培训实录]8G内存笔记本搭建vSphere测试环境

    最近一直在学习vSphere,本周参加了vSphere的培训,实验环境在国外,学生都用View连接到实验环境,两个人共用一台VC,两台vSphere,连接速度较慢,于是我尝试自己在笔记本电脑上搭建实验 ...

最新文章

  1. 探测参考信号(Sounding Reference Signal)
  2. CentOS7上安装KVM部署虚拟机
  3. python正则匹配数字_python 正则匹配字母数字中的任意数字,字母
  4. 机器学习 K-means算法_0(Matlab实现)
  5. android pay 绑定失败,实战Apple Pay失败!Android Pay你期待吗?
  6. 【计算机网络】TCP四次挥手
  7. (84)JTAG接口与格雷码特点-面试必问(八)(第17天)
  8. 淘宝直播应关注哪些方面?
  9. web.xml之context-param与init-param的区别与作用【转】
  10. Qt 学习之路 2(1):序 笔记
  11. ASP.NET Core中使用Csp标头对抗Xss攻击
  12. 【Docker端口映射】
  13. 宏基因组/微生物组杂志简介及2020最新影响因子
  14. HTML网页设计结课作业~仿小米商城网站纯HTML模板源码(HTML+CSS)
  15. Pentaho RestAPI用户角色管理
  16. java poc_无回显命令执行PoC编写指南(Apache Shiro Java反序列化)
  17. 基于vue的 表单设计器(拖拽生成表单)
  18. 生僻字html乱码,Tomcat 5.5.X及以上版本的生僻字乱码解决办法
  19. 嵌入式OS的现状、智能的物联网与未来的机器人
  20. 关于系统时钟的配置问题,如是stm32f1的系统时钟为72Mhz

热门文章

  1. C语言期末考试复习资料(选择题)
  2. Netwrix Auditor 新漏洞可导致Active Directory 域遭攻陷
  3. 漫谈技术职业人生——个人应该具备的能力
  4. EOS 智能合约开发实践(一)EOS钱包的简单使用
  5. java计算机毕业设计微博系统网站源代码+数据库+系统+lw文档
  6. centos7使用yum安装MySQL8.0
  7. 深圳公务员连续两年考核不称职将被辞退
  8. cge模型可以用matlab实现么,CGE模型错误求解
  9. 前端组件库(Element UI)的实现原理:教你如何实现自定义组件库,并打包发布至npm
  10. 20个免费网站测试工具(转)