1.keil AC6移植freeRTOS解决(100+)报错问题
2.å¨å¦ä¹ freertosä¹åï¼åºå¦ä¹ åªäºä¸è¥¿
3.FreeRTOSv202212.01移植到STM32
4.FreeRTOS移植过程-STM32基于STM32CubeMX环境
5.嵌入式实时操作系统RTOS市场和技术发展的源码变化
6.FreeRTOS源码探析之——消息队列
keil AC6移植freeRTOS解决(100+)报错问题
在使用keil移植freeRTOS时,需注意ac5与ac6编译器差异导致移植port文件.c和.h时可能出现报错问题。下载移植过程遵循以下步骤:
首先,源码下载freeRTOS源码,下载网络上教程丰富。源码
其次,下载通达讯源码在hal库或校准库下建立文件,源码接着移植源码,下载注意删除无用内容。源码
然后,下载将移植的源码.c和.h文件在keil中关联起来,编译过程中会显示未使用功能的下载报错信息,需针对具体错误注释或删除相关代码。源码
特别注意,下载在port.c文件中包含头文件(如f示例),源码之后编译时若发现函数重定义错误,应根据报错内容注释到相应的函数。
对于stmf4xx_it.c文件,确保注释或删除PendSV_Handler、SysTick_Handler和SVC_Handler,避免此类函数的未定义导致的报错。
解决报错的关键在于定义freeRTOS中未使用的钩子函数(vApplicationStackOverflowHook、vApplicationIdleHook、vApplicationTickHook 和 vApplicationMallocFailedHook),即使不实际使用,也需提供空定义以确保编译通过。
具体实现方式是将空定义添加到项目源文件中,例如main.c文件。正确操作后,所有报错解决,移植freeRTOS至keil AC6过程完成。
å¨å¦ä¹ freertosä¹åï¼åºå¦ä¹ åªäºä¸è¥¿
ããå¦ä¹ FreeRTOSåçåå¤å·¥ä½
ããè¿éåªè¦å好两ç¹å°±å¯ä»¥äºã
ãã1, ä»å®ç½ä¸è½½ææ°çç¨åºå
ãã2, å®ç½æFreeRTOSæ¯ä¸ªå½æ°çAPI说æï¼å·²ç»ç¸åºAPIçä¾åï¼å ¶å®æºç ç.hæ件éé¢ä¹æ大é¨åå½æ°ç使ç¨ä¾å
ãã æç¨è®¡å
ãã1 å æèªå·±åçè¿å 个ä¾å讲解ä¸ä¸ï¼å ³é®æ¯åæä¸ä¸æºç ï¼æºç å¿ é¡»å¾åæï¼è¦ä¸ç¥å ¶ç¶ä¸ç¥å ¶æ以ç¶ã
ãã2 ç¶åæå®æ¹çè¿å 个ä¾å讲解ä¸ä¸ï¼è¯´è¿å 个ä¾åç主è¦ç®çæ¯å åå¦ä¹ å®æ¹æ¯å¦ä½ä½¿ç¨è¿ä¸ªRTOSçï¼é常æåèä»·å¼ã
ãã3 é对æ们æ¿åèªå·±çå¤è®¾ï¼åä¸å¥å®æ´çï¼åºäºFreeRTOSçåºå±é©±å¨ï¼è®©è¿äºé©±å¨è½å¤æ´å ææçå¨FreeRTOSä¸é¢å·¥ä½ã
FreeRTOSv.移植到STM
介绍
将FreeRTOSv.移植到STMFC8T6单片机的过程概述。此版本为当前最新,适用于开发者进行系统级编程。源码ajax
硬件平台
选用STMFC8T6作为移植目标,此型号单片机提供丰富的外设资源,适合各种嵌入式应用。
软件架构与操作步骤
1. 从freertos.org/zh-cn-cmn下载源代码。注意,V9.0以后版本由Amazon收购后开发,V9.0被认为较为稳定。本文档介绍的移植方法适用于最新版本,与旧版本相比,源代码变化不大,可进行对比学习。
2. 解压源码并复制FreeRTOS目录内容至项目目录下。删除除Source文件夹外的所有文件,Source文件夹是核心模块,包含实际移植所需的文件。
3. 进入Source文件夹,删除非源代码文件,保留include和portable目录,前者包括头文件,后者为接口文件。
4. 进入Source下的portable文件夹,删除非必要的文件和文件夹(如RVDS和MemMang),仅保留与M3内核相关的ARM_CM3接口文件以及heap_4.c,其余可保留但暂不使用。
5. 从FreeRTOSv.\FreeRTOS\Demo\CORTEX_STMF_Keil复制FreeRTOSConfig.h至include文件夹。此配置文件用于系统裁剪。
6. 将保留的文件添加到工程中,并配置文件路径。确保编译无错误。
创建任务的详细步骤
在main.c文件中,创建任务。关注stmfx_it.h文件,增加xPortSysTickHandler外部声明,源码代管并注释掉SVC_Handler和PendSV_Handler。SysTick_Handler作为定时器回调函数,用于调度处理。
在FreeRTOSConfig.h中添加中断宏定义,由port.c中的汇编语言实现,用于任务启动和切换。设置INCLUDE_xTaskGetSchedulerState为1。
在main.h中加入RTOS头文件,包含操作系统所需的所有调用文件。
至此,重新编译即可运行程序。最后,确保工程总目录包含标准库stdlib(3.5.0版本),以支持完整的硬件抽象层。
FreeRTOS移植过程-STM基于STMCubeMX环境
移植FreeRTOS到STM微控制器的过程相对直接,得益于FreeRTOS提供的示例和支持STM HAL库。以下是关键步骤的概述:
首先,使用STMCubeMX创建新项目,配置好MCU系列、型号、时钟设置及所需外设。
接着,集成FreeRTOS,STMCubeMX会帮助你添加必要的代码和配置文件。配置周期性中断,通常通过STM的硬件定时器来触发FreeRTOS调度。
内存管理是关键,FreeRTOS提供了多种方案,需在`FreeRTOSConfig.h`中选择。调整任务堆栈大小和优先级,根据应用需求选择静态或动态分配方式。
确保上下文切换和中断管理代码与STM系列兼容,可能涉及特定Cortex-M核心的avilib源码细节。同时,确认使用的编译器与FreeRTOS兼容。
将FreeRTOS源代码添加到项目,编译并链接,可能需要修改`FreeRTOSConfig.h`以适应需求。通过调试器加载到设备,检查初始化和中断功能。
运行基础示例任务如LED闪烁或串口通信,验证系统运行。进一步进行性能和稳定性测试,确保移植的稳定性和效率。
移植过程可能因所选STM系列和开发环境的不同而有所差异。STMCubeMX和STMCubeIDE提供了FreeRTOS集成,简化配置步骤。在其他环境,可能需要更手动地进行配置。
嵌入式实时操作系统RTOS市场和技术发展的变化
随着世纪年代的到来,RTOS在嵌入式系统设计中的主导地位日益稳固,众多工程师纷纷选择使用预置的RTOS,而非自建。技术发展方面,呈现了以下几个关键点:
首先,为适应日益多样化的微处理器,RTOS的设计趋向于更加灵活和可移植。新的处理器技术推动了RTOS能在短时间内支持多种硬件平台,提升了其适用性。
其次,开源趋势也影响到了RTOS市场。越来越多的RTOS供应商开始提供源代码,甚至包含生产版税,以满足开发者对于灵活性和降低成本的需求。
在后PC时代,对实时性要求不高的likeshop源码产品,如手持设备,开始广泛采用RTOS,如微软的WinCE、Plam OS和Java OS等,这些产品正是针对这些新兴应用场景进行的定制开发。
对于电信设备和控制系统,高可靠性成为新要求。例如,瑞典Enea公司的OSE和WindRiver的Vxwork AE着重于支持高可用性和热切换功能,以满足此类应用的严格标准。
然而,RTOS市场的格局并非一成不变。Windriver收购ISI后一度形成垄断,但其决定放弃PSOS,转而发展Vxwork与PSOS融合版本,这为其他RTOS供应商提供了新的竞争机会,使得用户有了更多选择。
最后,嵌入式Linux在消费电子领域崭露头角,韩国和日本的企业已将其应用在手持设备上。这一趋势得到了Intel和Motorola等半导体厂商的大力支持与投资,显示出嵌入式Linux市场的强劲增长势头。
FreeRTOS源码探析之——消息队列
消息队列是FreeRTOS中的一种关键数据结构,用于实现进程间通信。其运作机制首先由FreeRTOS分配内存空间给消息队列,并初始化为空,此时队列可用。任务或中断服务程序可以给消息队列发送消息,发送紧急消息时,消息将直接放置于队头,确保接收者能优先处理。这种机制保证了紧急消息的优先级。
为了防止消息队列被并发读写时的混乱,FreeRTOS提供了阻塞机制,确保操作的进程能够顺利完成,不受其他进程干扰。接收消息时,若队列为空,进程可选择等待,直到消息到达。在发送消息时,只有队列允许入队时,发送才成功,避免了队列溢出。优先级较高的进程将优先访问消息队列,这通过任务优先级排序实现。
消息队列控制块包含了队列的管理信息,如消息存储位置、头尾指针、消息大小和队列长度等。这些信息在创建队列时即被初始化,并且无法改变。每个消息队列与消息空间共享同一段连续内存,只有在队列被删除时,这段内存才会被释放。消息队列长度在创建时指定,决定了消息空间总数。
FreeRTOS通过xQueueGenericCreate()函数创建消息队列,该函数首先分配内存,然后初始化队列。初始化过程涉及队列长度和消息大小等参数的设置,并通过xQueueGenericReset()函数进行队列复位。
队列复位时,vListInitialise()函数构建了列表结构,这是消息队列内部的组织形式。列表结构体定义了节点类型,而vListInitialise函数初始化了列表,为消息队列的使用做好准备。
发送消息时,xQueueSend()或其底层实现xQueueGenericSend()函数根据参数选择发送位置。默认情况下,消息会发送至队尾。接收消息则通过xQueueReceive()或xQueueGenericReceive()函数实现,参数通常包括队列句柄和接收的消息指针。
消息队列的发送和接收过程中,若队列已满或为空,可能会触发任务切换,以避免阻塞进程。这种机制确保了消息队列在进程间通信中的高效和有序,是FreeRTOS系统中实现进程间协作的关键组件。
STM上的FreeRTOS实时操作系统
FreeRTOS是一款在嵌入式系统中广泛使用的实时操作系统,而STM是一系列由STMicroelectronics开发的微控制器。
在STM上使用FreeRTOS可以充分利用其多核处理能力,并实现多任务管理、任务调度等功能。下面将详细介绍如何在STM上使用FreeRTOS,并给出一些示例代码。
首先,确保你已经具备以下硬件准备:
- STM开发板
- 串行调试接口(如ST-LINK)用于下载程序
- 集成开发环境(IDE),如Keil MDK或STMCubeIDE
- FreeRTOS源代码
在创建一个新的FreeRTOS项目之前,需要对FreeRTOS进行配置。主要的配置包括选择所需的内核功能、任务数和任务堆栈大小等。这些配置的具体方法可以参考FreeRTOS的官方文档。
在FreeRTOS中,任务是最基本的执行单元。以下是一个简单的示例,展示了如何创建两个任务并实现它们的简单调度。
在FreeRTOS中,使用RTOS API可以进行任务的创建、删除、挂起和恢复等操作。以下是一些常用的API示例:
在使用FreeRTOS时,需要进行硬件准备,配置FreeRTOS,创建任务,并使用RTOS API进行任务管理和通信操作。通过合理地调度任务、管理资源和进行任务间通信,可以实现复杂的嵌入式应用程序。
FreeRTOS与STM的结合,使嵌入式系统的性能和稳定性得到显著提升,为开发人员提供了强大的工具来创建高效且可靠的多任务系统。
rtems开发环境搭建
rtems是一款开放源码的实时操作系统(RTOS),特别适用于需要实时性的嵌入式系统。它支持多种处理器架构和文件系统,例如 ARM、PowerPC、Intel、SPARC、RISC-V、MIPS 等,且提供 POSIX 标准应用编程接口(API)。在太空飞行、医疗、网络等领域的应用中,rtems 已展现出其强大的潜力。
该操作系统的一大特色是其广泛的兼容性,它支持 种处理器架构和约 种板级支持包(BSPs),为用户提供多种选择。rtems 还具备多核对称多处理(SMP)、动态加载、嵌入式 shell 等功能,进一步增强了其实时性和灵活性。rtems 的 TCP/IP 网络堆栈取自 FreeBSD,提供了强大的网络支持,还集成了 USB 功能,满足了多种应用需求。
rtems 的构建工具非常专业,能够根据芯片平台定制出一系列工具,包括编译工具链和 newlib 库。用户可以使用官方的 Git 仓库获取最新源码,并通过配置文件自定义工具链,确保构建过程的高效性和稳定性。rtems 的构建流程全面,从源码下载到内核和应用的裁剪、编译,都能提供详细的指导和文档支持。
在实际搭建过程中,使用的是 rtems-5. 版本。首先,下载对应的源码包,包括 rtems-source-builder、rtems 源码包以及用户手册。搭建过程主要参考用户手册进行,手册详细介绍了整个构建流程,是搭建环境的关键文档。
搭建环境的宿主机是 macOS 系统,官方文档中提到 macOS 对 rtems 支持良好,无需担心兼容性问题。在用户目录下创建 rtems-workspace 文件夹,将源码包解压至此,再创建一个名为 rtems-5.1.0-rc1-tools 的目录存放自定义工具包。接下来,使用命令行定制编译工具,如选择 rtems-arm 工具集合。
构建过程较为复杂,包含多步细节,用户可以通过查看生成的日志文件来跟踪构建过程。使用 gcc 版本 7.5.0 进行验证,结果显示编译过程顺利,最终生成的工具符合预期。
FreeRTOS递归互斥信号量
递归互斥信号量是一种特殊的互斥信号量,不同于普通互斥信号量,已经获取递归互斥信号量的任务可以再次获取此信号量,即任务可以嵌套使用,次数不限。递归互斥信号量同样需解决优先级继承问题,获取的次数必须释放相同的次数,且不能在中断服务函数中使用。
递归互斥信号量的实现通过宏调用xQueueCreateMutex()函数创建,此函数源码细节参考互斥信号量章节3.1的介绍。释放递归互斥信号量使用宏调用xSemaphoreGiveRecursive()函数,调用xQueueGiveMutexRecursive()完成释放过程。获取递归互斥信号量使用宏调用xSemaphoreTakeRecursive()函数,执行xQueueTakeMutexRecursive()实现获取。
实例展示了递归互斥信号量的应用。通过STMCubeMX将FreeRTOS移植至工程,创建优先级高低不同的三个任务与一个递归互斥信号量。在MDK-ARM软件中编程,编译无误后下载至开发板,使用串口调试助手观察调试信息。
如需获取FreeRTOS递归互斥信号量实例的完整工程源代码,请关注公众号并在公众号内发送指定消息。