FreeRTOS移植到STM32F103步骤与注意事项

合集下载

在MDK中为STM32移植FreeRTOS

在MDK中为STM32移植FreeRTOS

在MDK中为STM32移植FreeRTOS/***************************************************************************** FreeRTOS版本是V7.0.1。

STM32本人用的是大容量的stm32f103zgt6,故启动文件使用startup_stm32f10x_hd.s。

固件库版本V3.5.0。

编译环境用的是MDK Verson:4.22。

注:用户在移植FreeRTOS操作系统前最好先移植好STM32的固件库,调试好确保固件库能成功运行后,再进行操作系统的移植。

*****************************************************************************/ 1、在Project里新建一个文件夹并命名为FreeRTOS。

复制FreeRTOS解压包里的Source文件夹里的croutine.c,timers.c,list.c,queue.c,tasks.c以及Source->portable->RVDS->ARM_CM3->port.c以及Source->portable->MemMang->heap_2.c到自建的FreeRTOS文件夹。

按新建FreeRTOS组并添加相应文件。

如下图:2、在FreeRTOS文件夹里再新建一个文件夹include。

在include里面加入如下文件:①FreeRTOS解压包里的Source文件下include文件夹中的所有.h文件;②Source->portable->RVDS->ARM_CM3->portmacro.h;③FreeRTOS解压缩包里的Demo 文件下找到CORTEX_STM32F103_Keil文件夹(用户根据自己的开发平台选择相应文件夹),找到FreeRTOSConfig.h文件加入到include中。

使用IAR移植ucos到stm32的步骤

使用IAR移植ucos到stm32的步骤

芯片型号stm32f103ve,编译器IAR for ARM 6.3准备材料在st官网上下载最新的固件库(现在是v3.5.0),这个库作用非常大,可以帮我们快速开发出想要的功能,但是网上有很多人说这个库有漏洞,本人水平有限就不得而知了,这里直接上地址。

解压后得到目录如下图在ucos官网上下载移植stm32移植版的ucosii代码,这个需要注册一下,不多说直接上接上地址下载安装后得到目录如下图建立工程首先建三个文件目录:CMSIS用来存放cpu和系统的相关的文件、STM32F10x_StdPeriph_Driver用来存放cpu的硬件驱动、ucosii用来存放ucos的源代码。

复制固件库\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\CoreSupport目录下的core_cm3.c和core_cm3.h到工程文件夹下的CMSIS目录中。

复制固件库\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x目录下的stm32f10x.h、system_stm32f10x.c、system_stm32f10x.h三个文件到工程文件夹下的CMSIS目录中。

在固件库\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\iar目录中选取相应的开始文件,这里我选取的是startup_stm32f10x_hd.s复制到到工程文件夹下的CMSIS目录中。

复制固件库\STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Template目录中的stm32f10x_conf.h、stm32f10x_it.c、stm32f10x_it.h三个文件到工程文件夹下的CMSIS目录中。

stm32f103移植到GD32修改内容及注意事项

stm32f103移植到GD32修改内容及注意事项

stm32f103移植到GD32修改内容及注意事项在国内芯片紧张的情况下,目前如果项目没有成型可以安装官方提供的GD32的pack,选择相关的pack即可正常编程。

若程序已经成型,需要移植,首先就要考虑芯片类型(stm32系列)的选择。

选择过程中首先要根据已用stm32单片机的封装和引脚定义去对应相关的gd32芯片类型。

这里我选用的是GD32f305芯片替换stm32f103rc,所作设置如下:1.点击魔术棒选择stm32f103芯片2.根据晶振设置晶振,这里设置72MHz3.根据芯片flash大小设置STM32F10X_LD、STM32F10X_MD、STM32F10X_HD,不知道的可以查手册,实在不行就一个一个去试。

4.Debug中设置,如果用的是jlink仿真器就选择jlink仿真器,其他的就选用其他的,这里选择SW方式。

另外注意:如果右边框读取不到单片机信息,或者下载不了程序可以把速度降低一些,设置10k或者5k基本可以解决!Device芯片选型C++内容设置Debug内容设置1.软件移植注意事项1.1系统方面的注意事项stm32移植到GD32上芯片选择上的问题:1.1.1 HSE相关内容修改在V3.x的库,启动时间宏定义在xxx32f10x.h头文件中;在V3.0以前的库,其启动时间宏定义在xxx32f10x.h中(HSEStartUp_Ti meOut);修改前:#define HSE_STARTUP_TIMEOUT ((uint16_t)0x0500) /*!< Time out for HSE start up */修改后:#define HSE_STARTUP_TIMEOUT ((uint16_t)0xFFFF) /*!< Time out for HSE start up */这里我使用的库是stm32f10x.h里面,位置如图所示。

修改原因:GD和STM32的晶振部分电路设计有一定的差异,两者对外部高速晶振的参数要求也不一样,修改HSE_STARTUP_TIMEOUT宏定义可以保证晶振正常起振。

FreeRTOS移植到STM32F103步骤与注意事项说明书

FreeRTOS移植到STM32F103步骤与注意事项说明书

FreeRTOS移植到STM32F103步骤与注意事项前言:由于之前听过太多人抱怨移植FreeRTOS到STM32有各种各样的问题,小灯经过一年多对FreeRTOS的研究并在公司产品中应用,多少有些心得,接下来就由小灯以最新版的FreeRTOS为例一步一步移植到STM32F103上,并提醒大家某些需要注意的事项。

本文档为非正式技术文档,故排版会有些凌乱,希望大家能提供宝贵意见以供小灯参考改进。

下面先以IAR移植为例,说明移植过程中的诸多注意事项,最后再以MDK移植时不再重复说明,所以还是建议大家先花些时间看IAR的移植过程,哪怕你不使用IAR,最好也注意下那一大堆注意事项!一、从官网下载最新版的FreeRTOS源码下面的网址是官方最新源码的下载地址:https:///projects/freertos/files/latest/download?source=files目前官方提供的最新版本是v9.0.0, FreeRTOS源码在解压目录下的路径为FreeRTOS_V9.0.0rc2\FreeRTOS\SourceFreeRTOS组织为了抢用户也是拼了命的,不信你打开Demo文件夹看看,里面提供了FreeRTOS在各种单片机上已经移植好的工程,如果建工程时遇到什么问题,可以参考下这些Demo。

不过小灯现在着重于自己动手移植FreeRTOS,考虑到原子哥@正点原子的用户比较多,绝大多数习惯了使用MDK来开发STM32,因此小灯分别以IAR和MDK两种使用比较广泛的开发环境来移植FreeRTOS。

说到IAR和MDK,不得不提的是小灯自从用了IAR之后就果断放弃了MDK,相信很多人有这个经历,哈哈!在开始移植FreeRTOS之前,先介绍下FreeRTOS的源码:FreeRTOS的源码比较少,源文件也远没有UCOS多,不过麻雀虽小五脏俱全,FreeRTOS的短小精悍也是最令小灯着迷的,虽然缺少了很多组成部分,例如GUI、网络协议栈、文件系统等,不过这些统统都不是问题,因为完全可以移植第三方的组件!一不小心牛逼又吹大了,哈哈!回归正题,FreeRTOS的源码核心部分是tasks.c和list.c,其余的几个文件功能都是可选的,例如软件定时器、队列、协程等等,小灯就不介绍了,有兴趣的话可以到官网上看介绍。

FreeRTOS 移植

FreeRTOS 移植

FreeRTOS 移植此部分介绍移植FreeRTOS的基本步骤。

▪修改范例是用于不同的编译器或运行于不同的硬件▪FreeRTOS移植向导修改范例是用于不同的编译器或运行于不同的硬件这篇文章有什么用?FreeRTOS已经包含很多范例程序——每一个均用于:1. 一个特定的微控制器2. 一个特定的开发工具(编译器,调试器,等等)3. 一个特定的硬件平台(原型或评估板)在官方主页左边的’RTOS Ports‘菜单下有大量的文档。

然而不可能为每一个微控制器、编译器和评估板的组合提供一个范例工程——因此有可能没有一个范例程序与你的需求完全吻合。

这个文档就是指导你如何修改与组合范例程序来更好的符合你的要求。

十分容易就可以使用一个现有的评估板范例经过修改然后用在另外一个上——如果是从一个编译器修改到另外一个可能会复杂一点。

这个文档提供相似平台的移植指引。

然而把FreeRTOS从一个平台移植到另外一个完全不同的、还未被支持的处理器内核体系并不是一件容易的工作。

因此这个文档不会包括建立一个全新的FreeRTOS平台的内容。

转换一个范例用于不同的评估板这部分描述把一个已有的范例程序从一个原型板转换到另一个的步骤,没有改变使用的微控制器与编译器。

作为例子,这些指引将用来把运行于SAM7S硬件上的IAR SAM7S的范例转换为运行于Olimex SAM7-P64原型板。

在进行下一步前要保证前面的步骤完全成功:1. 初始编译:应该使用一个现有的范例程序来进行移植练习,因此首先要检查你能否成功的编译一个已有的范例程序——在进行任何修改之前。

多数情况下,范例程序可以正常编译而不会有任何的错误或警告。

官方网站上包含有下载的每个范例程序的完整文档,包含编译向导。

请完整的阅读这些文档。

2. 修改LED IO:LED提供一个最简单的可视化方式来反馈范例程序正在运行,因此尽快的使led在新的硬件平台上运行起来是非常有用的。

可能将要移植的硬件平台与范例程序硬件平台的LED并不是处于同一个IO端口上——因此需要做一些小的修改。

在STM32中移植FreeRTOS(纯净版)

在STM32中移植FreeRTOS(纯净版)
3、 打开 Keil 软件,建立新工程。 这里,新建 STM32F103ZET_FreeRTOS.uvproj,保存在上面新建的 Project 文件夹下面。 选择所使用的 STM32 芯片,确定后,会弹出是否加载启动代码的提示窗口,选择否,
因为我们使用 startup 文件夹下的启动代码。 下面使用图片说明:
及 ..\FreeRTOSV7.2.0\FreeRTOS\Source\portable\MemMang 下 heap_2.c 到 自 建 的
E:\STM32\PROJ\FreeRTOS\src 下。
3、 复 制
..\FreeRTOSV7.2.0\FreeRTOS\Source\include 下 所 有 .h 文 件
a._htmresc:ST 的 LOGO,对开发无用; b.Libraries:关键文件夹,也就是 STM32 的库文件,包含外设驱动源文件和头文件; c.Project:包含外设例程和工程模板,本文不用; d.Utilities:评估版文件夹,本文不用; e.Release_Notes.html:固件库版本发布说明,不用理会; f.stm32f10x_stdperiph_lib_um.chm:类似 MSDN,开发中经常会查看,本文
跳转到 080 行,将 DCD SysTick_Handler 修改为 DCD xPortSysTickHandler 6、 在 main.c 文件头部#include 一下头文件: FreeRTOS.h、task.h、queue.h
至此,FreeRTOS 在 STM32 上的移植完毕。在 main 中创建任务后启动任务调度器就可 以运行了。
文件夹分别命名为 inc 和 src。复制 ..\FreeRTOSV7.2.0\FreeRTOS\Source 下 croutine.c、

stm32f103的freertos项目案例

stm32f103的freertos项目案例

STM32F103的FreeRTOS项目案例可以是一个使用FreeRTOS操作系统来管理任务的简单应用程序。

以下是一个可能的案例:一、项目需求1.使用STM32F103开发板。

2.使用Keil5作为开发环境。

3.移植FreeRTOSv10.2.1到STM32F103上。

4.创建两个任务:Task1和Task2。

5.Task1每秒打印字符"1",Task2每秒打印字符"2"。

二、项目步骤1.新建一个基于STM32F103的固件库工程。

2.复制FreeRTOSv10.2.1相关文件到工程目录,包括:o FreeRTOS\Source\include目录下的所有.h文件。

o FreeRTOS\Source\portable\RVDS\ARM_CM3下的portmacro.h文件。

o FreeRTOS\Demo\CORTEX_STM32F103_Keil下的FreeRTOSConfig.h文件。

3.配置FreeRTOSConfig.h文件,设置合适的任务堆栈大小、任务优先级等参数。

4.编写Task1和Task2的函数实现,使用无限循环打印字符。

5.在main函数中创建Task1和Task2,并开启任务调度。

三、代码示例以下是Task1和Task2的函数实现示例:c复制代码void Task1Function(void *param) {while(1) {printf("1");vTaskDelay(pdMS_TO_TICKS(1000)); // 延迟1秒}}void Task2Function(void *param) {while(1) {printf("2");vTaskDelay(pdMS_TO_TICKS(1000)); // 延迟1秒}}在main函数中创建任务并开启任务调度:c复制代码int main(void) {xTaskCreate(Task1Function, "Task1", 100, NULL, 1, &xHandleTask1);xTaskCreate(Task2Function, "Task2", 100, NULL, 1, NULL);vTaskStartScheduler(); // 开启任务调度while(1); // 防止编译器优化掉main函数}。

STM32适合移植的操作系统

STM32适合移植的操作系统

基于STM平台且满足实时控制要求操作系统,有以下4种可供移植选择。

分别为μClinux、μC/OS-II、eCos、FreeRTOS和都江堰操作系统(djyos)。

下面分别介绍这四种嵌入式操作系统的特点及不足。

1、μClinuxμClinux是一种优秀的嵌入式Linux版本,其全称为micro-control Linux,从字面意思看是指微控制Linux。

同标准的Linux相比,μClinux的内核非常小,但是它仍然继承了Linux操作系统的主要特性,包括良好的稳定性和移植性、强大的网络功能、出色的文件系统支持、标准丰富的API,以及TCP/IP网络协议等。

因为没有MMU内存管理单元,所以其多任务的实现需要一定技巧。

μClinux在结构上继承了标准Linux的多任务实现方式,分为实时进程和普通进程,分别采用先来先服务和时间片轮转调度,仅针对中低档嵌入式CPU 特点进行改良,且不支持内核抢占,实时性一般。

在内存管理上由于μClinux是针对没有MMU的处理器设计的,不能使用处理器的虚拟内存管理技术,只能采用实存储器管理策略。

系统使用分页内存分配方式,在启动时对实际存储器进行分页。

系统对内存的访问是直接的,操作系统对内存空间没有保护,多个进程可共享一个运行空间,所以,即使是一个无特权进程调用一个无效指针也会触发一个地址错误,并有可能引起程序崩溃甚至系统崩溃。

μClinux操作系统的中断管理是将中断处理分为两部分:顶半处理和底半处理。

在顶半处理中,必须关中断运行,且仅进行必要的、非常少、速度快的处理,其他处理交给底半处理;底半处理执行那些复杂、耗时的处理,而且接受中断。

因为系统中存在有许多中断的底半处理,所以会引起系统中断处理的延时。

μClinux对文件系统支持良好,由于μClinux继承了Linux完善的文件系统性能,它支持ROMFS、NFS、ext2、MS-DOS、JFFS等文件系统。

但一般采用ROMFS 文件系统,这种文件系统相对于一般的文件系统(如ext2)占用更少的空间。

FreeRTOS—低功耗之睡眠模式,停机模式,待机模式

FreeRTOS—低功耗之睡眠模式,停机模式,待机模式

FreeRTOS—低功耗之睡眠模式,停机模式,待机模式低功耗是 MCU 的⼀项重要的指标,⽐如某些可穿戴的设备,其携带的电量有限,如果整个电路消耗的电量特别⼤的话,就会经常出现电量不⾜的情况,影响⽤户体验。

STM32F103 睡眠模式介绍说明:在 FreeRTOS 系统上⾯实现睡眠⽅式仅需了解这⾥讲解的知识基本就够⽤了,更多睡眠⽅式的知识请看 STM32F103 参考⼿册和Cortex-M3 权威指南。

在系统或电源复位以后,微控制器处于运⾏状态。

当 CPU 不需继续运⾏时,可以利⽤多种低功耗模式来节省功耗,例如等待某个外部事件时,⽤户需要根据最低电源消耗、最快速启动时间和可⽤的唤醒源等条件,选定⼀个最佳的低功耗模式。

STM32F103 有三种低功耗模式:睡眠模式(Cortex™-M3 内核停⽌,所有外设包括 Cortex-M3 核⼼的外设,如 NVIC、系统滴答定时器 Systick 等仍在运⾏)。

停机模式(所有的时钟都已停⽌)。

待机模式(1.8V 电源关闭)。

如何进⼊睡眠模式通过执⾏ WFI(等待中断)或 WFE(等待事件)指令进⼊睡眠状态。

根据 Cortex™-M3 系统控制寄存器中的 SLEEPONEXIT 位的值,可以通过两种⽅案选择睡眠模式进⼊机制:SLEEP-NOW:如果 SLEEPONEXIT 位被清除,当 WFI 或 WFE 被执⾏时,微控制器⽴即进⼊睡眠模式。

SLEEP-ON-EXIT:如果 SLEEPONEXIT 位被置位,系统从最低优先级的中断处理程序中退出时,微控制器就⽴即进⼊睡眠模式。

实际应⽤中我们采⽤ WFI 指令进⼊睡眠模式,睡眠模式的进⼊机制是采⽤的 SLEEP-NOW。

因为系统复位上电后 SLEEPONEXIT 位是被清除的,所以这个位也不需要专门的去设置。

另外在睡眠模式下,所有的 I/O 引脚都保持它们在运⾏模式时的状态。

在 FreeRTOS 系统上,不使⽤ tickless 低功耗模式的话,我们可以将 WFI 指令放到空闲任务⾥⾯实现。

【FreeRTOS操作系统教程】第8章 FreeRTOS调试方法(打印任务执行情况)

【FreeRTOS操作系统教程】第8章  FreeRTOS调试方法(打印任务执行情况)
81串口打印调试说明82stm32f103实现串口打印调试83stm32f407实现串口打印调试84stm32f429实现串口打印调试85总结很多时候我们需要了解任务的执行状态任务栈的使用情况以及各个任务的cpu使用率这时就需要用到官方提供的两个函数vtasklist和vtaskgetruntimestats
这里使用的是 32 位变量来保存 50us 一次的计数值,最大支持计数时间:2^32 * 50us / 3600s = 59.6 分钟。运行时间超过了 59.6 分钟将不准确。
具体在 FreeRTOS 的工程中如何做才可以实现任务信息获取呢?下面分三步进行说明。
8.2.1 使能相关宏定义
需要在 FreeRTOSConfig.h 文件中使能如下宏定义:
RCC_APB1PeriphClockCmd(bsp_GetRCCofTIM(TIMx), ENABLE); }
if (_ulFreq == 0) {
TIM_Cmd(TIMx, DISABLE);
/* 关闭定时输出 */
/* 关闭 TIM 定时更新中断 (Update) */ {
NVIC_InitTypeDef NVIC_InitStructure; /* 中断结构体在 misc.h 中定义 */ uint8_t irq = 0; /* 中断号, 定义在 stm32f4xx.h */
8.1 串口打印调试说明
很多时候,我们需要了解任务的执行状态,任务栈的使用情况以及各个任务的 CPU 使用率,这时就 需要用到官方提供的两个函数 vTaskList 和 vTaskGetRunTimeStats。用户就可以通过这两个函数获得任 务的执行情况。
获取了任务执行情况后,可以通过串口将其打印出来,当然,也可以通过任何其它方式将其显示出来。 本教程配套的例子统一采用串口打印的方式显示任务的执行情况。另外有一点要特别注意,这种调试方式 仅限测试目的,实际项目中不要使用,这种测试方式比较影响系统实时性。

基于MDK编程STM32程序无法使用,硬件仿真在汇编窗口看到停留在“0x0800XXXXB。。。

基于MDK编程STM32程序无法使用,硬件仿真在汇编窗口看到停留在“0x0800XXXXB。。。

基于MDK编程STM32程序⽆法使⽤,硬件仿真在汇编窗⼝看到
停留在“0x0800XXXXB。

为⽅便⼯作上做测试,移植FreeRTOS到STM32F103xx,先做简单的UART1 printf。

⼯程编译通过,运⾏逻辑也确认可⾏,可就是⽆法正常打印消息。

对⽐了⽹上的移植⼯程也是⼀致,硬件仿真在汇编窗⼝看到停留
在“0x0800XXXX BEAB BKPT 0xAB",遂⽹上搜索"BKPT",找到下⾯⽹友的笔记,
参考:
试了“问题3”后可正常运⾏了,再看“问题4”时才想起使⽤了“printf”却没有勾选“MiclroLIB”。

打开“Options for target...”->“target”勾选“Use MiclroLIB”后⼀切就正常了。

总结:
温故⽽知新,学习要不断重温,将细节变为习惯,不然⼩⼩的细节却是折腾去⼤部分冤枉时间。

关于FreeRTOS移植问题

关于FreeRTOS移植问题

关于FreeRTOS移植问题
1、复制正点原子的基本程序,使用miniSTM32F103的开发板作为调试硬件,主芯片为
STM32F103RB,如下图所示的程序及开发板:
2、更改程序中LED对应的引脚,改为PB8和PB9,更改led.c以及led.h文件中的相应端口
定义部分:
3、更改工程文件中的CORE文件夹中的启动文件startup_stm32f10x_hd.s为
startup_stm32f10x_md.s,因为STM32F103RB属于中等容量的芯片,所以需选择md的启动文件;
4、修改芯片名称,此处由于keil uv5的问题,对应的芯片型号无法找到,重新安装了程序
才找到相应的芯片;在Options for Target ‘FreeRTOS’中的C/C++中的Define中更改启动文件STM32F10X_MD,USE_STDPERIPH_DRIVER;
5、修改完上述部分后,编译程序,发现出现16个错误:
网上查找相应的资料发现,芯片的内存空间过低引起的,需要更改堆栈的大小即可,但网上却没有明确需要修改的堆栈在什么位置,只得一个文件一个文件的试,最终发现在FreeRTOSConfig.h中,#define configTOTAL_HEAP_SIZE ((size_t)(20*1024)) ,将其中的20改小即可:
6、重新编译后程序无错误提示,将程序通过J-Link烧录到开发板中,两颗小灯开始正常闪
烁,至此移植成功。

STM32用FreeRTOS时任务优先级和中断优先级说明

STM32用FreeRTOS时任务优先级和中断优先级说明

STM32⽤FreeRTOS时任务优先级和中断优先级说明下⾯对 FreeRTOS 优先级相关的⼏个重要知识点进⾏下说明,这些知识点在以后的使⽤中务必要掌握牢固。

FreeRTOS 中任务的最⾼优先级是通过 FreeRTOSConfig.h ⽂件中的 configMAX_PRIORITIES 进⾏配置的,⽤户实际可以使⽤的优先级范围是 0 到 configMAX_PRIORITIES – 1。

⽐如我们配置此宏定义为 5,那么⽤户可以使⽤的优先级号是 0,1,2,3,4,不包含 5,对于这⼀点,初学者要特别的注意。

⽤户配置任务的优先级数值越⼩,那么此任务的优先级越低,空闲任务的优先级是 0。

建议⽤户配置宏定义 configMAX_PRIORITIES 的最⼤值不要超过 32,即⽤户任务可以使⽤的优先级范围是0到31。

因为对于CM内核的移植⽂件,⽤户任务的优先级不是⼤于等于32的话, portmacro.h⽂件中的宏定义configUSE_PORT_OPTIMISED_TASK_SELECTION会优化优先级列表中要执⾏的最⾼优先级任务的获取算法(对于 CM 内核的移植⽂件,此宏定义默认是使能的,当然,⽤户也可以在FreeRTOSConfig.h ⽂件中进⾏配置)。

相⽐通⽤的最⾼优先级任务获取算法,这两种⽅式的对⽐如下: 通⽤⽅式,没有优化---配置宏定义 configUSE_PORT_OPTIMISED_TASK_SELECTION 为 0: 所有平台的移植⽂件都可以配置为 0,因为这是通⽤⽅式。

纯 C 编写,⽐专⽤⽅式效率低。

可⽤的优先级数量不限制。

专⽤⽅式,进⾏优化---配置宏定义 configUSE_PORT_OPTIMISED_TASK_SELECTION 为为 1: 部分平台⽀持。

这些平台架构有专⽤的汇编指令,⽐如 CLZ(Count Leading Zeros)指令,通过这些指令可以加速算法执⾏速度。

FreeRTOS 在 STM32 的移植

FreeRTOS 在 STM32 的移植

3.定义用户主动引起内核调度的 2 个函数 强制上下文切换,用在任务环境中调用 #define portYIELD() vPortYieldFromISR()
强制上下文切换,用在中断处理环境中调用 #define portEND_SWITCHING_ISR( xSwitchRequired ) 4.定义临界区的管理函数 中断允许和关闭 #define portDISABLE_INTERRUPTS() #define portENABLE_INTERRUPTS() 临界区进入和退出 #define portENTER_CRITICAL() #define portEXIT_CRITICAL() 用于在中断环境的中断允许和关闭 #define portSET_INTERRUPT_MASK_FROM_ISR() 0;vPortSetInterruptMask() vPortEnterCritical() vPortExitCritical() vPortSetInterruptMask() vPortClearInterruptMask() if( xSwitchRequired ) vPortYieldFromISR()
恢复新任务 的上下文
• 通过pxCurrentTCB->pxTopOfStack恢复新任务的栈顶指针 • 恢复R4-R11并更新进程堆栈指针PSP
2. 中断允许和关闭的实现,通过 BASEPRI 屏蔽相应优先级的中断源 vPortSetInterruptMask: push { r0 } mov R0, #configMAX_SYSCALL_INTERRUPT_PRIORITY msr BASEPRI, R0 pop { R公司
vPortStartFirstTask
• 设置中断优先级 • 配置心跳时钟

FreeRTOS移植教程

FreeRTOS移植教程

FreeRTOS移植教程此次移植是针对STM32F407IG这款芯片的,其中固件库也匹配相应芯片的。

FreeRTOS版本为FreeRTOSV7.2.0。

所做的移植工作是在这个目录\FreeRTOS 移植\完成的。

1、固件库移植由于在其他移植文件里提到过这个固件库的移植,在此不做详细的描述。

1)文件准备在工作目录\FreeRTOS 移植\下创建\Libraries目录,再创建\CMSIS和\STM32F4xx_StdPeriph_Driver两个目录,将相应的文件复制的这两个目录中。

结果如下。

2)添加工程在工作目录中创建\Project目录,在Project目录中创建MDK-ARM和user 两个目录。

将创建的工程保存在MDK-ARM目录中。

在固件库的\Project目录中找到如下文件,复制到\user目录中。

创建Keil工程,添加工程文件。

如下图。

固件库的文件,可以按需添加,此次移植,我不做删减。

工程中的配置信息,很重要,若不配置,编译出错。

此处,我做过测试,编译通过,开发板上运行通过。

建议在移植的时候做测试,避免后面出现错误扎堆,便于后面的移植工作。

2、FreeRTOS移植1)文件准备在目录\Project下创建\FreeRTOS,在目录\FreeRTOS下创建inc和src两个目录。

将\FreeRTOSV7.2.0\FreeRTOS\Source目录下的6个.c文件考到src目录下。

将\FreeRTOSV7.2.0\FreeRTOS\Source\portable\RVDS\ARM_CM4F目录下port.c 文件考入src目录下。

将\FreeRTOSV7.2.0\FreeRTOS\Source\portable\MemMang目录下heap_2.c文件考入src目录下。

将\FreeRTOSV7.2.0\FreeRTOS\Source\include目录下所有.h文件考入inc目录下。

将\FreeRTOSV7.2.0\FreeRTOS\Source\portable\RVDS\ARM_CM4F目录下portmacro.h文件考入inc目录下。

STM32CubeMX+FreeRTOS学习[2] 二值信号量(Lu)

STM32CubeMX+FreeRTOS学习[2] 二值信号量(Lu)

FreeRTOS学习之二:二值信号量前提:默认已经装好MDK V5和STM32CubeMX,并安装了STM32F1xx系列的支持包。

硬件平台:STM32F1xx系列。

目的:学习使用二值信号量进行任务同步。

二值信号量主要用于任务的同步。

本文例子使用STM32CubeMX配置创建两个任务,一个任务每秒钟发送一次信号量,另一个等待信号量并控制LED的输出状态。

Step1.打开STM32CubeMX,点击“New Project”,选择芯片型号,STM32F103RBTx。

Step2.配置时钟引脚。

Step3.配置PA8和PD2为Output,并把用户标签分别改为LED0,LED1。

Step4.将系统时基源改为TIM4。

Step5.使能FreeRTOS。

Step6.配置时钟树。

8M输入时,通过PLL得到72M内部时钟。

Step7.配置FreeRTOS。

在Tasks and Queues选项卡中,默认配置了一个名为defaultTask的任务,其优先级为普通,任务堆栈大小为128字,任务函数名为StartDefaultTask。

双击蓝色的地方,弹出对话框,将任务名修改为Periodic,将任务函数名修改为PeriodicTask。

点击Add按钮,增加一个任务Handle,优先级设置为Normal,函数名为HandleTask。

在Timers and Semaphores选项卡,点击Binary Semaphores项右边的“Add”按钮,添加一个信号量,名称改为bSem01。

注:该步骤中,除了添加任务和信号量,其他的都使用默认参数。

Step8.生成代码。

等完成后直接打开工程。

工程基本组织结构如下图,其中Application/User组中的文件是用户可以修改的,而其他组中的文件一般不进行修改。

Step9.分析程序结构。

在进入main函数之前,先定义了几个变量,声明了几个函数。

再看main函数。

将main函数整理,删除很多注释之后,得到下图所示内容。

FreeRtos学习总结

FreeRtos学习总结

FreeRtos学习总结
背景
最近项⽬需要,花了⼏天时间学习了FreeRTOS,因为之前有操作系统和底层的基础,所以上⼿⾮常快。

正⽂
基础篇
学习⽅法:建议先阅读本⼈整理的⽂章;再结合FreeRTOS⽂档官⽅的全英⽂档《Mastering_the_FreeRTOS_Real_Time_Kernel-A_Hands-On_Tutorial_Guide》加深学习理解。

介绍FreeRTOS的有关概念
实际移植到STM32F103,以及介绍⼀些原理。

同类⽂章还有:
对于 FreeRTOSConfig.h ⽂件进⾏介绍。

因为在FreeRTOS是⼀个⾼度定制化的系统,⽽体现定制化就是靠这个Config⽂件。

介绍任务的有关使⽤
如何对任务进⾏调试(主要针对内存管理)
简单地介绍了有关函数。

⼀个轻量级同步的机制。

如何使⽤队列
如何使⽤信号量
⾼级篇
todo。

FreeRTOS任务无法调度

FreeRTOS任务无法调度

FreeRTOS任务⽆法调度
问题:在STM32F103VET6平台上移植的FreeRTOS,⼀开始跑得好好的,添加了⼀个⼩任务,然后程序⽆法正常运⾏
调试过程:
1.断点调试,程序死在了调度上⾯,if( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ tskIDLE_PRIORITY ] ) ) > ( UBaseType_t ) 1 )
2.分析可能是分配的堆栈空间不够,加了堆栈空间之后还是不⾏,
3.后来在⽹上查找,有⽹友说是内存不够
4.把其中⼏个任务的堆栈空间改⼩了
5.调试OK
6.提出疑问,那到底⼀个任务分配多少堆栈空间呢,那么总⼤⼩不能超过多少呢,后来看到两篇⽂章
得出⼏点:
1启动任务中的Stack_Size和任务堆栈没关系,它是提供给普通函数⽤来存放临时变量⽤的,⽐如中断处理函数
2任务堆栈是从TOTAL_HEAP_SIZE这个值中分配来的,虽然我的任务总堆栈空间还是⼩于这个值,但是还是崩溃了,这点还需要进⼀步研究
3如果任务堆栈⽆法再缩⼩,那就把这个值增⼤
4任务的堆栈空间是4字节的,所以⼀般不需要很⼤的空间,⼀般任务控制块需要70-80个字节,再加上临时变量就差不多了,
注意:static修饰的临时变量是放在静态存储区的,⼀般栈区就存临时变量,堆区主要存放分配的内存,静态存储区存放静态变量,全局变量,常量等⼀般编译的时候就分配好了。

Keil环境中建立带FreeRTOS的STM32L项目

Keil环境中建立带FreeRTOS的STM32L项目

Keil环境中建立带FreeRTOS的STM32L项目1、先把source文件夹复制至project目录,然后在keil中添加RTOS文件,如图:其中heap_2.c按需选择,可以是heap_1.c等,若需croutine型任务则还需添加croutine.c文件。

2、添加include目录,位于source下的include文件夹。

3、把FreeRTOSConfig.h文件复制到source下的include文件夹,或者其他用户文件夹下也可,这是FreeRTOS的功能配置文件,要按需修改的。

4、为了能连接到portmacro.h文件,还需添加include路径Source\portable\RVDS\ARM_CM35、以下移植步骤细节需参考“FreeRTOS在STM32上的移植V1.0”。

首先修改PORTMACRO.H 文件。

基本不用修改。

6、port.c文件也基本不用修改。

7、PORTASM.S文件在keil环境是不需要的,相关的函数放在了port.c文件中。

8、修改startup文件(要选择对应芯片的文件,并且要先取消其只读属性):SVC_Handler修改为vPortSVCHandlerPendSV_Handler修改为xPortPendSVHandlerSysTick_Handler修改为xPortSysTickHandler并在“__heap_limit”下面,“PRESERVE8”前面加入以下内容IMPORT xPortPendSVHandlerIMPORT xPortSysTickHandlerIMPORT vPortSVCHandler9、修改PORTMACRO.H中的configCPU_CLOCK_HZ为对应的频率值,单位是Hz。

全速的STM32L 可设为32000000。

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

FreeRTOS移植到STM32F103步骤与注意事项年05月29日 11:16:36•1496原文地址:前言:由于之前听过太多人抱怨移植FreeRTOS到STM32有各种各样的问题,小灯经过一年多对FreeRTOS的研究并在公司产品中应用,多少有些心得,接下来就由小灯以最新版的FreeRTOS为例一步一步移植到STM32F103上,并提醒大家某些需要注意的事项。

本文档为非正式技术文档,故排版会有些凌乱,希望大家能提供宝贵意见以供小灯参考改进。

下面先以IAR移植为例,说明移植过程中的诸多注意事项,最后再以MDK移植时不再重复说明,所以还是建议大家先花些时间看IAR的移植过程,哪怕你不使用IAR,最好也注意下那一大堆注意事项!一、从官网下载最新版的FreeRTOS源码下面的网址是官方最新源码的下载地址:目前官方提供的最新版本是v9.0.0, FreeRTOS源码在解压目录下的路径为FreeRTOS_V9.0.0rc2\FreeRTOS\SourceFreeRTOS组织为了抢用户也是拼了命的,不信你打开Demo文件夹看看,里面提供了FreeRTOS在各种单片机上已经移植好的工程,如果建工程时遇到什么问题,可以参考下这些Demo。

不过小灯现在着重于自己动手移植FreeRTOS,考虑到原子哥@正点原子的用户比较多,绝大多数习惯了使用MDK来开发STM32,因此小灯分别以IAR和MDK两种使用比较广泛的开发环境来移植FreeRTOS。

说到IAR和MDK,不得不提的是小灯自从用了IAR之后就果断放弃了MDK,相信很多人有这个经历,哈哈!在开始移植FreeRTOS之前,先介绍下FreeRTOS的源码:FreeRTOS的源码比较少,源文件也远没有UCOS多,不过麻雀虽小五脏俱全,FreeRTOS的短小精悍也是最令小灯着迷的,虽然缺少了很多组成部分,例如GUI、网络协议栈、文件系统等,不过这些统统都不是问题,因为完全可以移植第三方的组件!一不小心牛逼又吹大了,哈哈!回归正题,FreeRTOS的源码核心部分是tasks.c和list.c,其余的几个文件功能都是可选的,例如软件定时器、队列、协程等等,小灯就不介绍了,有兴趣的话可以到官网上看介绍。

include文件夹里面的文件是操作系统相关的头文件,而portable这个文件夹有些奇葩,先看看里面有啥:这里的文件几乎都是与平台相关的,如果你要删掉这里的文件时就必须小心了,因为不是所有文件都能删除的。

注意文件夹MemMang,里面存放的是FreeRTOS自带的内存管理方案的源文件:关于内存管理方案的选择,小灯以后再跟大家讨论,现在只需要知道这些文件不能删就好。

接下来看看IAR文件夹的内容,里面都是跟单片机底层相关的,由于我们以STM32F103为例,因此只需要保留ARM_CM3文件夹即可,其余可选择性删除。

ARM_CM3文件夹里只有几个文件,这几个文件是操作系统最最底层的部分:接下来再看看Keil文件夹的内容,里面只有一个文件,文件提示See-also-the-RVDS-directory,意思是让我们参照RVDS目录下的文件。

其实我们以MDK建工程时,就是拿RVDS目录下的文件来替代的,因此我们应该把RVDS目录下的文件拷贝到Keil目录下,跟上面IAR 文件夹一样我们只拷贝ARM_CM3文件夹即可:到这里我们可以把其他无用的文件统统删掉了,portable目录下只保留下面几个文件夹的文件即可:现在已经把源码整理好了,接下来就开始移植工作吧!二、IAR下移植FreeRTOS事先说明下,小灯使用的IAR版本是关于IAR下如何创建STM32基础工程,小灯就偷下懒不介绍了,这入门级的知识还是交给卖开发板的人来传播吧,小灯就以自己平常用的简单工程为例:工程当中只有一个LED.c是小灯额外添加的,小灯一直停留在跑灯的水平,习惯用LED来观察现象,希望各位大神莫怪。

工程源码结构如下:其中FreeRTOS文件夹下就是FreeRTOS的源码:接下来在工程里面添加FreeRTOS文件:文件清单如下:FreeRTOS\tasks.cFreeRTOS\list.cFreeRTOS\portable\IAR\ARM_CM3\port.cFreeRTOS\portable\IAR\ARM_CM3\portasm.sFreeRTOS\portable\MemMang\heap_4.c这时有人可要问为何没有把FreeRTOS的所有文件都添加进去,原因我上面提过了,FreeRTOS的核心部分是tasks.c和list.c,其余的几个文件是可选部分,在此小灯就先不添加这些可选部分以简化我们的工程。

小灯建议大家使用内存管理的方案四heap_4.c,因为该方案具有内存块碎片合并功能,比heap_2.c的最优内存块分配方案要稳定很多,这是小灯经过很长时间测试对比出来的,公司的产品也是一直使用heap_4.c,稳定性无懈可击!接下来非常重要的一步就是添加头文件路径:头文件路径如下:$PROJ_DIR$\..\Source\FreeRTOS\include$PROJ_DIR$\..\Source\FreeRTOS\portable\IAR\ARM_CM3好了这时我们可以尝试编译下整个工程了,编译结果提示缺少了个头文件:FreeRTOS组织也真是奇葩,居然连这么重要的文件都不提供在源码里面!!!前面提醒过大家,新建工程时碰到问题一定要参考官方提供的Demo,既然Demo是一堆成品的工程,那么里面绝对有我们所需的这个FreeRTOSConfig.h我们就选择打开Demo\CORTEX_STM32F103_IAR下的这个工程吧,果不其然里面真的有我们需要的这个头文件:把这文件放哪里好呢,这是一直纠结小灯的问题,官方直接把这文件放在工程目录下,但这么重要的配置文件这么随便放似乎不太好吧。

在小灯看来,这个文件的重要性和打开的概率绝不比FreeRTOS内核文件低,所以还是把它放在源码里面比较合理:在C/C++ Compiler下添加头文件路径:$PROJ_DIR$\..\Source\FreeRTOS还有一个地方一定要十分注意,因为操作系统的最最底层的几个文件也需要用到FreeRTOSConfig.h头文件,而底层文件是用汇编来写的,因此必须在Assembler下添加FreeRTOSConfig.h头文件路径:好了再编译一次:0个错误0个警告,程序员最欢喜的莫过于看见这个结果了,哈哈!在编写系统任务前,有必要对配置文件FreeRTOSConfig.h进行检查。

FreeRTOSConfig.h里面几乎都是一些宏定义,关于这些宏定义的具体用法,可以在官网上查阅:小灯只以其中几个比较重要的参数作特别说明,下面以小灯修改过的FreeRTOSConfig.h为例作为说明:(1)定义系统底层相关的函数其中SVC中断时操作系统启动时进入的中断,而PendSV中断手动切换任务时进入的中断,SysTick中断不用我多说了,@正点原子的基础例程几乎都使用这个定时器定时,在这里SysTick是作为操作系统的心脏。

由于FreeRTOS对这几个中断的名称做了自己的定义,因此必须要重定义这几个函数才能正常进入中断,但这么做又会跟ST提供的stm32f10x_it.c文件当中定义的中断相冲突,因此必须将stm32f10x_it.c下对应的几个中断服务函数屏蔽掉,否则编译会提示函数重定义:(2)修改系统可屏蔽的中断优先级阈值FreeRTOS提供的可屏蔽中断优先级阈值是191,对应的十六进制数是0xBF:#defineconfigMAX_SYSCALL_INTERRUPT_PRIORITY 191由于STM32F103的优先级分组只有4个位,而CM3的优先级是以MSB 对齐的,也就是说STM32F103的优先级寄存器只有最高4位有效,低四位是无效的。

当操作系统进入临界区时,会把上面的可屏蔽中断优先级阈值写入BASEPRI寄存器以屏蔽部分中断:因此当进入临界区时,优先级对应0xB~0xF的中断均被屏蔽,而优先级处于0xB前面的中断不受影响。

这个跟CM0有区别,也是最值得注意的地方。

上述的基础知识不是小灯要重点提的,对CM3的优先级不熟悉的朋友建议查阅《Cortex-M3权威指南》,接下来才是小灯要重点提的。

由于使用@正点原子的开发板的用户比较多,很多人直接把FreeRTOS移植到原子哥的工程下,然后出现了各种各样的诡异问题,一直无解。

其中一个非常严重的问题就是小灯上面提及到的中断屏蔽的问题,下面小灯就这个问题进行一个简单的分析,先贴上@正点原子的部分代码:这是原子哥最常用的中断优先级分组方式,采用分组方式2,2位抢占优先级2位亚优先级。

但是在移植FreeRTOS时必须要修改成优先级分组方式4:把STM32的优先级分组的4个位均设成抢占优先级,也就是说完全放弃亚优先级。

为何要这么设置?其实这得怪FreeRTOS机构里面被驴踢过的逗逼,这些逗逼为了自己省事,直接默认不使用亚优先级,下面让大家见识下这群逗逼的解释:不过站在他们的角度来思考,其实我们也应该给他们那么一丁点儿理解,毕竟他们采取了一个比较简单的方法来获取不同厂商的单片机的有效优先级位数,算法是通过对优先级寄存器组的某一个寄存器写入0xFF,然后再读出来看实际上有多少位写入成功,然后根据实际的有效位数来重设优先级分组寄存器的分组方式(上面提到的分组方式4)。

有兴趣的可以研究下他们的算法,代码截图在下面:不知不觉越扯越远了,回归正题,到底为何要重设可屏蔽的中断优先级阈值,我们重新把思路理一下。

根据STM32的中断优先级的设计,只有高4位有效,还有FreeRTOS默认将4个优先级位均划分为抢占优先级。

由于FreeRTOS官方提供的中断优先级阈值是191(对应实际的0xB),也就是11~15的优先级均可被操作系统屏蔽。

但我们实际使用时设置的中断优先级一般不会使用到11打后的,例如@正点原子的基础例程里面使用最多的1~3,所以我们必须要修改这个值,否则我们要重新修改所有底层驱动的优先级。

那么怎么修改比较合理?这个就得看实际应用需要了,其实使用宏configMAX_SYSCALL_INTERRUPT_PRIORITY来屏蔽部分中断是比较合理的,相对于CM3,CM0没有中断优先级阈值寄存器,只能简单粗暴的开启全局中断和关闭全局中断。

操作系统在执行十分重要的工作时一般不能打断这个工作,尤其是这时在中断里面调用了操作系统的API函数,这都会严重影响系统的稳定性。

小灯对configMAX_SYSCALL_INTERRUPT_PRIORITY的理解是,这个数值打后的所有中断均划入操作系统管理,而这个数值打前的中断则归由用户自己管理,但用户必须十分小心地处理这些中断,用户可以使用这些中断来处理一些跟操作系统无关的工作。

相关文档
最新文档