在STM32中移植FreeRTOS(纯净版)
FreeRTOS操作系统配置参数说明
当然,如果没有使用内核方面的调试器,这个宏定义是没有意义的。
USE_APPLICATION_TASK_TAG
处于就绪状态的相同优先级任务使用时间片调度机制共享处理器时间。
MINIMAL_STACK_SIZE
此参数用于定义空闲任务的栈空间大小,单位字。默认128个字
MAX_TASK_NAME_LEN
定义任务名最大的字符数
USE_16_BIT_TICKS
系统时钟节拍计数使用TickType_t数据类型定义的。
图中描述了四个处于空闲优先级的任务,任务A、B和C是用户任务,任务I是空闲任务。上下文切换周期性的发生在T0、T1…T6时刻。当用户任务运行时,空闲任务立刻让出CPU,但是,空闲任务已经消耗了当前时间片中的一定时间。这样的结果就是空闲任务I和用户任务A共享一个时间片。用户任务B和用户任务C因此获得了比用户任务A更多的处理器时间。
USE_TASK_NOTIFICATIONS
设置USE_TASK_NOTIFICATIONS为Enable将会开启任务通知功能,有关的API函数也会被编译。设置宏USE_TASK_NOTIFICATIONS为Disabled则关闭任务通知功能,相关API函数也不会被编译。默认这个功能是开启的。开启后,每个任务多增加8字节RAM。
USE_PORT_OPTIMISED_TASK_SELECTION
FreeRTOS的硬件有两种方法选择下一个要执行的任务:通用方法和特定于硬件的方法。
Disabled:可以用于所有FreeRTOS支持的硬件;完全用C实现,效率略低于特殊方法;不强制要求限制最大可用优先级数。
在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中。
基于STM32的FreeRTOS应用问题解答
基于STM32的FreeRTOS应用问题解答1、如何将FreeRTOS 移植到不同的Cortex-M 内核?答:如果要将FreeRTOS 移植到正确的Cortex-M 产品,你必须从正确的目录导入port.c 文件。
例如,若微控制器是带有IAR 工具的Cortex-M0 内核,则您必须从FreeRTOS\Source\portable\IAR\ARM_CM0 获取port.c。
2、FreeRTOS 使用需要ROM/RAM?答:这取决于您的编译器、代码架构,以及RTOS 内核配置。
一般来说,RTOS 内核本身需要大约 5 到10 K 字节ROM 空间。
如果创建的线程或队列数增加,RAM 使用量就会上升。
3、怎样设置CPU 时钟?答:CPU 时钟由FreeRTOSConfig.h 中的configCPU_CLOCK_HZ 定义,比如在STM32CubeF4”>STM32CubeF4固件内它由SystemCoreClock 提供,表示HCLK 时钟(AHB 总线),通过调用SystemClock_Config() 函数配置RCC 时钟时会设置此值。
4、怎样设置中断优先级?答:任何使用RTOS API 函数的中断服务程序,其优先级必须手动设置为大于等于FreeRTOSConfig.h 文件中configMAX_SYSCALL_INTERRUPT_PRIORITY 的设置值。
这确保其中断的逻辑优先级低于等于configMAX_SYSCALL_INTERRUPT_PRIORITY 设置的优先级。
5、怎样使用非SysTick 时钟生成时间片中断?答:用户可选择性地自己提供时间片中断源,方法是使用非SysTick 的定时器生成中断:提供vPortSetupTimerInterrupt() 的实现,它会以FreeRTOSConfig.h 文件中定义的configTICK_RATE_HZ 常量指定的频率产生中断。
RISC-V MCU的FreeRTOS移植与应用开发
4M i c r o c o n t r o l l e r s &E m b e d d e d S ys t e m s 2021年第1期w w w .m e s n e t .c o m .c nR I S C V M C U 的F r e e R T O S 移植与应用开发付元斌,张爱华,何小庆(北京麦克泰软件技术有限公司,北京100085)摘要:具有相同的R I S C V 指令集的处理器实现并不相同㊂本文将针对基于R I S C V 开源指令集的处理器芯片G D 32V F 103M C U ,介绍F r e e R T O S 在I A R E WR I S C V 编译和开发环境下的移植过程㊂采用R T O S 后,嵌入式系统很难监控系统的运行时行为㊁发现应用存在的问题,本文基于T r a c e a l y z e r 分析工具直观地跟踪系统行为,分析系统中可能的错误,提高代码的鲁棒性㊂关键词:B u m b l e b e e 内核;T r a c e a l yz e r ;F r e e R T O S 移植;R I S C V 处理器中图分类号:T P 316.2 文献标识码:AP o r t i n g a n d A p p l i c a t i o n D e v e l o pm e n t o f F r e e R T O S B a s e d o n R I S C V M C U F u Y u a n b i n ,Z h a n g A i h u a ,H e X i a o q i n g(B e i j i n g M i c r o t e c R e s e a r c h S o f t w a r e T e c h n o l o g y C o .L t d .,B e i j i n g 100085,C h i n a )A b s t r a c t :P r o c e s s o r i m p l e m e n t a t i o n s w i t h t h e s a m e R I S C V i n s t r u c t i o n s e t a r e n o t t h e s a m e .T h i s p a p e r w i l l i n t r o d u c e t h e m i gr a t i o n p r o c e s s o f F r e e R T O S u n d e r I A R E WR I S C V e n v i r o n m e n t f o r t h e p r o c e s s o r c h i p G D 32V F 103b a s e d o n R I S C V o p e n s o u r c e i n s t r u c -t i o n s e t .W i t h t h e R T O S ,i t i s d i f f i c u l t t o m o n i t o r t h e r u n t i m e b e h a v i o r o f t h e s y s t e m a n d f i n d p r o b l e m s i n t h e a p pl i c a t i o n .T h i s a r t i c l e w i l l u s e t h e T r a c e a l y z e r a n a l y s i s t o o l t o v i s u a l l y s y s t e m b e h a v i o r ,a n a l y z e p o s s i b l e e r r o r s i n t h e s y s t e m ,a n d i m pr o v e t h e r o b u s t n e s s o f t h e c o d e .K e yw o r d s :B u m b l e b e e K e r n e l ;T r a c e a l y z e r ;F r e e R T O S p o r t i n g ;R I S C V M C U 0 引 言R I S C V 是基于精简指令集(R I S C )原则的开源指令集架构(I S A ),具有良好的应用前景㊂目前R I S C V 架构的处理器陆续发布,其生态环境及应用也在不断丰富,但相对于A R M 架构,R I S C V 的应用还处于起步阶段,复杂的应用需要R T O S 支撑㊂目前许多R T O S ,如μC /O SI I I ㊁F r e e R T O S ㊁R T T h r e a d ㊁Z e p h y r O S ㊁e m b O S 等,都提供了对R I S C V 处理器的支持㊂采用了R T O S 后,传统的调试手段很难监控系统的实时行为,在R T O S 上进行开发时需要额外的工具和方法验证你的软件行为,提高代码的可靠性㊂本文使用兆易创新的G D 32V F 103V E V A L 开发板,基于I A R E W R I S C V 编译和开发环境,介绍如何将F r e e R T O S移植到G D 32V F 103上,并使用P e r c e p i o 的T r a c e a l y z e r 工具分析基于F r e e R T O S 的应用程序运行时行为㊂1 G D 32V F 103R I S C V M C UG D 32V F 103R I S C V M C U 基于N u c l e i B u m b l e b e e内核,芯片提供了108MH z 的主频,以及16~128K B 的片上闪存和6~32K B 的S R AM ,具有多个通用定时器和多通道D MA 控制器㊂G D 32V F 103M C U 的中断控制器(E C L I C )提供了多达68个外部中断并可嵌套16个可编图1 G D 32V F 103V E V A L 评估板程优先级,G D 32V F 103M C U 支持多种外设如U A R T ㊁S P I ㊁I 2C ㊁G P I O 等㊂GD 32V F 103VE V A L 评估板(见图1)使用G D 32VF 103V B T 6作为主控制器,板载J T A G接口以及丰富的外设资源㊂R T O S 在G D 32V F 103上的移植仅使用了内核相关的资源㊂N u c l e i B u m b l e b e e 内核支持R V 32I MA C 指令集架构;特权模式支持机器模式和用户模式,可以实现R T O S 与应用的隔离,提升软件安全;寄存器组包含32个通用寄存器㊁R I S CV 标准的状态寄存器以及内核自定义敬请登录网站在线投稿(t o u g a o.m e s n e t.c o m.c n)2021年第1期5的C S R寄存器㊂内核提供了计时器单元(T i m e r U n i t, T I M E R),产生的计时器中断和软件中断可以用于R T O S 时钟节拍处理和任务切换㊂B u m b l e b e e内核支持在R I SC V标准C L I C基础上优化而来的改进型内核中断控制器(E n h a n c e d C o r e L o c a l I n t e r r u p t C o n t r o l l e r,E C L I C),用于管理所有的中断源㊂E C L C的每个中断源可以配置为向量或非向量处理模式㊂向量模式中断被处理器内核响应后,处理器直接跳入该中断的向量入口存储的目标地址;非向量模式中断被处理器响应后,处理器直接跳入所有中断共享的入口地址㊂但中断响应时,处理器硬件不会保存上下文,需要软件实现㊂2F r e e R T O S和T r a c e a l y z e r介绍F r e e R T O S是英国人R i c h a r d B a r r y2003年发布的开源实时内核㊂F r e e R T O S支持超过35种C P U架构,是世界最受开发者欢迎的R T O S,在2017年每3分钟就有一次下载㊂F r e e R T O S有一个系列软件,包括F r e e R T O S(开源版本)㊁O p e n R T O S(授权版本)㊁S A F E R T O S(安全版本)和A m a z o n F r e e R T O S(开源物联网操作系统),开源的F r e e R T O S遵循M I T l i c e n s e模式㊂在多线程软件系统中,R T O S带来的复杂度让源代码和运行时行为的关联变得不那么明显,传统的调试器不足以理解系统的行为,特别是运行时行为㊂P e r c e p i o的T r a c e a l y z e r工具运行在W i n d o w s或L i n u x P C上,可用于目标系统运行L i n u x㊁F r e e R T O S㊁O p e n R T O S㊁S A F E R T O S㊁W i n d R i v e r V x W o r k s㊁μC/O SI I I和e m b O S的R T O S应用行为分析㊂2.1F r e e R T O S的功能F r e e R T O S支持抢占和时间片轮询两种任务调度方式,支持无限数量的应用任务;提供队列㊁信号量㊁互斥信号量㊁事件标志等内核机制,满足任务间同步及通信需求;此外,针对低功耗应用提供了t i c k l e s s模式㊂最新版本F r e e R T O S提供了针对I A R及G C C工具链的标准R I S C V处理器内核移植示例,支持32位及64位架构内核(R V32I和R V64I)㊂它包含了预配置的O p e n I S A V E G-A b o a r d㊁S i F i v eH i F i v e开发板㊁Q E MU模拟器以及用于M i c r o c h i p M2G L025开发板的A n t m i c r o R e n o d e模拟器示例,可以扩展支持任何RI S C V处理器,但因为每种R I S C V处理器在微架构实现上的不同,需要有移植的工作㊂2.2T r a c e a l y z e r分析工具T r a c e a l y z e r软件工具能够快速㊁轻松地收集多任务软件有用和有意义的行为,可以快速集成到现有的开发环境,通过快照模式或流模式采集系统运行时数据㊂T r a c e-a l y z e r提供超过30种视图可视化R T O S运行时行为,视图间以直观的方式相互关联,洞察运行时行为(包括任务运行时间信息㊁各任务之间的通信流㊁C P U的使用率等),帮助开发人员解决问题,提高软件的可靠性,改善软件的性能㊂3F r e e R T O S移植到G D32V F103M C UF r e e R T O S内核绝大部分都采用C语言编写,只有与处理器相关的上下文切换采用汇编语言实现,目的是保证上下文切换的效率㊂将F r e e R T O S移植到G D32V F103 M C U上的关键要点是实现以下4个步骤:开启和关闭中断的方式;进入和退出临界区的方式;产生周期性的中断作为系统的时钟节拍;任务的上下文切换㊂3.1中断管理和临界区实现代码的临界区也称为代码的临界段,这部分代码在执行时不允许被打断㊂F r e e R T O S的临界区通过关中断来实现,在进入临界段之前须关中断,而临界段代码执行完毕后要立即开中断㊂G D32V F103M C U的E C L I C中断控制器有一个中断目标阈值级别寄存器(m t h),可以实现部分中断屏蔽,优先级别低于该阈值的中断将不会被响应㊂在移植F r e e R T O S时,通过设置m t h来实现开关中断,对于优先级别比阈值高的中断则不受F r e e R T O S管理,中断不存在额外的延迟㊂3.2系统时钟节拍支持操作系统需要一个时钟节拍,以实现系统的延时㊁超时等与时间相关的处理㊂时钟节拍是特定的周期性中断,中断的周期就是节拍的时间㊂节拍的时间长短根据实际应用决定,时钟节拍的频率越高,系统的开销就越大㊂R I S C V架构定义了一个64位宽度的m t i m e计数器,当m t i m e计数值增加到与m t i m e c m p寄存器预设的值相等时,可以产生中断㊂选择m t i m e计数器来产生系统时钟节拍,根据m t i m e的时钟频率和系统节拍频率算出m t i m e c m p的值,当中断发生后,通过改写m t i m e c m p或者m t i m e的值来清除中断㊂3.3实现上下文切换上下文是某一时间点C P U的寄存器内容,F r e e R T O S 能够正确完成任务调度的关键是上下文切换㊂上下文切换的过程包括:把即将退出运行态的任务的运行现场保存到其任务堆栈;从下一个要运行的任务的堆栈中恢复它的运行现场㊂上下文切换的时间应尽可能短,一般由汇编代码编写,作为操作系统移植的一部分㊂上下文切换分为任务级别及中断级别的切换㊂上下文切换的代码通常放在异常处理程序中,该异常的优先级别应设置为最低㊂在R I S C V架构的处理器上,能够用来作为任务切6M i c r o c o n t r o l l e r s &E m b e d d e d S ys t e m s 2021年第1期w w w .m e s n e t .c o m .c n换的异常有两种:e c a l l 异常和软件中断㊂e c a l l 异常通过调用e c a l l 指令来触发;软件中断通过往m s i p 寄存器写 1 触发,写 0 清除㊂G D 32V F 103的软件中断连接到E C L I C 单元进行统一管理㊂我们实现的F r e e R T O S 移植选用软件中断作为上下文切换的实现机制㊂3.4 移植文件修改F r e e R T O S 与处理器相关的移植代码存储在p o r t -m a c r o .h ㊁po r t A S M.s 和p o r t .c 三个文件当中㊂p o r t m a c -r o .h 头文件定义了F r e e R T O S 使用的数据类型㊁进入和退出临界区的宏㊁实现开关中断的宏,以及触发和清除软件中断的宏㊂po r t A S M.s 中用汇编语言实现v P o r t S t a r t F i r s t T a s k ()函数,用于启动第一个任务,它的核心操作是从p x C u r r e n t -T C B 中取出当前就绪任务中优先级最高任务的堆栈指针S P ,通过S P 恢复寄存器现场㊂此外,实现软件中断的服务函数e c l i c _m s i p _h a n d l e r ()将当前的寄存器现场(通用寄存器x 1㊁x 5~x 31,机器模式状态寄存器m s t a t u s 以及机器模式异常P C 寄存器m e p c )保存到当前在运行任务的堆栈当中,然后从p x C u r r e n t T C B 取出下一个就绪中优先级最高任务的堆栈指针S P 恢复寄存器现场,完成任务的上下文切换㊂po r t .c 文件中重点实现堆栈初始化函数p x P o r t I n i t i a -l i s e S t a c k ()㊁启动F r e e R T O S 调度器特定的处理函数x P o r t S t a r t S c h e d u l e r ()㊁系统时钟节拍定时器初始化函数v P o r t S e t u p T i m e r I n t e r r u pt (),以及系统时钟节拍中断服务函数x P o r t S y s T i c k H a n d l e r ()㊂这几个函数分别需要根据R I S C V 架构和G D 32V F 103M C U 硬件特性来实现其功能㊂3.5 移植测试和验证验证移植采用调试和借助相应的辅助工具来进行,使用I A R E WR I S C V 建立项目,在代码中创建两个用户任务进行调试,代码调试时需要验证:①通过在系统时钟节拍I S R 和软件中断I S R 中添加断点,结合R I S C V 的m t i m e 和m c y c l e 寄存器验证系统时钟节拍正确产生,且软件中断能够正常触发㊂②启动第一个任务时,通过添加断点查看从任务堆栈中恢复的寄存器内容是否与堆栈初始化时写入的内容一致,从而测试p x P o r t I n i t i a l i s e S t a c k ()和v P o r t S t a r t F i r s t -T a s k()函数的工作正确性㊂③在执行任务上下文切换时,在软件中断服务程序中添加断点,单步执行,同时通过E WR I S C V 的m e m o r y 观察窗口查看压栈到当前任务堆栈中的内容是否与对应的寄存器内容相同;在恢复下文时,检查从下一个执行任务堆栈中恢复的寄存器内容是否与堆栈中的一致㊂验证e c l i c _m s i p_h a n d l e r ()软件中断服务函数的上下文切换正确性㊂④启动第一个任务和任务上下文切换的代码验证能正常工作,移植的F r e e R T O S 已可以实现基本的任务调度,接着再继续测试开关中断操作和临界区是否正常㊂测试开关中断需要增加另外一个外设中断,将其优先级别分别设置大于或小于m t h 阈值进行测试,代码中手动调用开关中断操作A P I ,检测中断触发是否与设计的模式一致,验证F r e e R T O S 对中断的控制㊂采用同样的方法测试进入和退出临界区㊂⑤通过F r e e R T O S 系统服务调用测试,测试系统的各项服务(如信号量㊁消息队列㊁事件标志等)是否正常,并测试在受F r e e R T O S 管理的I S R 中发信号㊁消息等操作是否正确㊂基础调试测试都通过之后,已经基本可以验证移植是否成功㊂在此基础上还可以借助额外的工具继续验证,例如通过E WR I S C V 自带的F r e e R T O S 调试插件显示的信息进行确认(如图2所示)㊂图2 E W R I S C V R T O S 调试插件T a s k 窗口4 T r a c e a l yz e r 分析工具的应用4.1 移植跟踪记录器库T r a c e a l yz e r 的跟踪记录器库是运行在嵌入式目标端的一个软件库,与F r e e R T O S 项目集成在一起,负责记录R T O S 在运行时产生的事件㊂记录的事件如果是存储在R AM 中,这种工作方式称为快照模式(S n a p s h o t );如果是通过通信端口实时发送到P C 端软件,则工作在流模式(S t r e a m i n g)㊂跟踪记录器库不依赖于处理器硬件,只需要使用一个高精度的定时器产生时间戳,为记录的事件添加时间信息㊂R I S C V 架构的处理器可以利用内核的m c y c l e 计数器来产生时间戳,m c y c l e 是一个64位的计数器,对C P U 的周期进行计数,所以频率与C P U 时钟相同,精度非常高㊂m c y c l e 由两个32位的寄存器组成,T r a c e a l y z e r 只需要使用低32位寄存器㊂在t r c H a r d w a r e P o r t .h 中定义G D 32V F 103的时间戳实现接口:#d e f i n e T R C _HW T C _T Y P E T R C _F R E E _R U N N I N G _32B I T _I N -C R#d e f i n e T R C _HWT C _C O U N T r e a d _c s r (m c yc l e )#def i n e T R C _HWT C _P E R I O D 0敬请登录网站在线投稿(t o u ga o .m e s n e t .c o m.c n )2021年第1期7#d e f i n e T R C _HWT C _D I V I S O R 4#d e f i n e T R C _HWT C _F R E Q _H Z T R A C E _C P U _C L O C K _H Z #d e f i n e T R C _I R Q _P R I O R I T Y _O R D E R 1T r a c e a l y z e r 也需要实现临界区,防止在记录事件时发生任务切换,导致产生错误㊂实现是通过关中断,可以直接使用F r e e R T O S 的关中断机制在t r c K e r n e l P o r t .h 中实现临界区的宏接口:#d e f i n e T R A C E _A L L O C _C R I T I C A L _S E C T I O N ()i n t __i r q _s t a t u s;#d e f i n e T R A C E _E N T E R _C R I T I C A L _S E C T I O N ()__i r q _st a -t u s =p o r t S E T _I N T E R R U P T _MA S K _F R OM _I S R ();#d e f i n e T R A C E _E X I T _C R I T I C A L _S E C T I O N ()po r t C L E A R _I N T E R R U P T _MA S K _F R OM _I S R (__i r q_s t a t u s );以上是将T r a c e a l yz e r 跟踪记录器库移植到一款处理器上需要做的工作㊂4.2 跟踪并分析F r e e R T O S 应用将T r a c e a l yz e r 跟踪记录器库添加到E WR I S C V 的F r e e R T O S 项目中,并进行必要的配置,工作在快照模式㊂在应用代码中创建4个任务,分别为L e d 1T a s k~L e d 3T a s k ㊁B u t t o n T a s k ,任务优先级依次递增,程序运行一段时间,将快照数据通过E WR I S C V 保存成H e x 文件并加载到P C 端的T r a c e a l yz e r 中进行分析㊂如图3所示,通过水平时间轴视图查看各个任务的执行情况:每个任务或中断占一行,从左向右为时间轴的方向,行中有色矩形为该任务或中断的一次执行实例㊂由时间轴窗口可以快速地预览整个运行过程中系统的执行情况,放大窗口的时间分辨率之后可以仔细了解任务执行时相关的内核事件和时间信息㊂图3 T r a c e a l yz e r 水平时间轴视图4.3 任务的时间量分析R T O S 的任务或者中断称为参与者(A c t o r),参与者的一次执行称为实例㊂分析任务的执行通常需要了解如下几种时间:起始和结束时间,参与者实例的开始和结束时间;执行时间,参与者实例使用的C P U 时间量,不包括抢占;响应时间,从参与者实例开始到结束的时间(更确切地说,任务的响应时间是从任务开始准备就绪时计算的,即内核将任务的调度状态设置为就绪的时间);等待时间,图4所示实例中参与者实际没有执行的时间,计算方式为[(结束时间开始时间)(执行时间)];启动时间,从任务就绪到开始执行之间的这段时间㊂图4 F r e e R T O S 分析基础实例的时间关系(场景2发生了抢占)以L e d 3T a s k 的第38个实例(如图5所示)为例,等待时间为从任务就绪到任务代码开始执行的这段时间,时长为7μs ,因为该实例未发生被抢占的情况,所以这7μs 的时间是完成任务上下文切换所需的时间㊂图5 L e d 3T a s k 任务实例38的时间量通过跟踪到的事件和记录的时间戳信息,T r a c e a l yz e r 能够生成多种视图来观测系统运行时存在的问题,例如设计缺陷导致的线程饥饿㊁死锁等,以及发现系统中不必要的延迟,帮助开发者解决系统的问题,提高嵌入式系统的实时性㊂这些问题使用传统调试手段难以发现,而且效率不高㊂5 结 语本文介绍了基于R I S C V 指令集的微控制器G D 32V F 103在I A R E W R I S C V 工具链上移植F r e e R T O S的过程,以及对移植的系统进行验证的方法㊂在此基础上移植T r a c e a l y z e r 跟踪记录器库,并通过跟踪F r e e R T O S 系统运行进一步观测系统的运行,并对任务的执行进行了分析㊂嵌入式与物联网是R I S CV 最活跃的应用市场,R I S C V 给嵌入式系统开发带来许多优势,越来越多的开发者开始尝试R I S C V ㊂以上工作对于基于R T O S 技术的R I S C V 嵌入式开发与应用会有所帮助㊂参考文献[1]芯来科技.B u m b l e b e e 内核指令架构手册[E B /O L ].[202009].h t t p s ://w w w.r i s c v m c u .c o m /qu i c k s t a r t q u i c k s t a r t i n d e x u p d f i d 8.h t m l .2626M i c r o c o n t r o l l e r s &E m b e d d e d S ys t e m s 2021年第1期w w w .m e s n e t .c o m .c n在D C A S E 2019测试集和U r b a n S o u n d 8K 测试集上,模型的识别精度如表1和表2所列,并且与一些最新的方法进行了对比㊂表1 精度比较(D C A S E 2019)模 型测试精度(D C A S E )A u d i o R e s n e t80.2%R e s N e t l i k e m o d e l [14]76.6%B a s e l i n e s ys t e m [15]62.5%表2 与其他方法的精度比较模 型测试精度(U r b a n S o u n d 8K )A u d i o R e s n e t76.4%U n s u p e r v i s e d f e a t u r e l e a r n i n g[16]73.6%B a s e l i n e s ys t e m [17]68%从表中可以看到,与其他先进的分类方法相比,本文提出的A u d i o R e s ne t 模型在分类精度上有较大提高㊂4 结 语本文针对声源目标分类中小样本训练时分类模型性能不佳的问题,使用深度学习方法对不同声源发出的声音数据进行分类,使用l o g me l 声谱图特征作为特征预提取方法,采用基于R e s n e t 网络结构的分类模型对预提取特征数据进行分类处理,建立了识别效果良好的深度学习声信号分类模型A u d i o R e s n e t ㊂该模型性能在D C A S E 2019和U r b a n S o u n d 8K 数据集上得到了验证,实现了良好的效果,在声源探测领域具有一定的工程应用价值㊂参考文献[1]I S N A R D V ,C HA S T R E S V ,V I A U DD E L MO N I ,e t a l .T h e t i m e c o u r s e o f a u d i t o r y r e c o g n i t i o n m e a s u r e d w i t h r a pi d s e q u e n c e s o f s h o r t n a t u r a l s o u n d s [J ].S c i e n t i f i c R e po r t s ,2019,9(1):8005.[2]樊新海,石文雷,张传清.基于V M D 多尺度熵和A B C S V M 的装甲车辆识别[J ].装甲兵工程学院学报,2018,32(6):6873.[3]孙国强,樊新海,石文雷.基于M F C C 和支持向量机的装甲车辆识别研究[J ].国外电子测量技术,2017,36(10):3135.[4]R U B E N G O N Z A L E ZH E R N A N D E Z F ,P A S T O RS A N C H E Z F E R N A N D E Z L ,S U A R E Z G U E R R A S ,e ta l .M a r i n e m a mm a l s o u n d c l a s s i f i c a t i o nb a s e d o n a p a r a l l e lr e c o g n i t i o n m o d e l a n d o c t a v e a n a l y s i s [J ].A p pl i e d A c o u s t i c s ,2017(119):1728.[5]S A N C H E Z F E R N A N D E Z L P ,S A N C H E Z P E R E Z L A ,C A R B A J A L H E R N A NDE Z J J ,e t a l .A i r c r a f t C l a s s i f i c a t i o na n d A c o u s t i c I m pa c t E s t i m a t i o n B a s e d o n R e a l T i m e T a k e o f f N o i s e M e a s u r e m e n t s [J ].N e u r a l P r o c e s s i n g Le t t e r s ,2013,38(2):239259.[6]陈心昭.噪声源识别技术的进展[J ].合肥工业大学学报(自然科学版),2009,32(5):609614.[7]竺乐庆,张真.基于M F C C 和GMM 的昆虫声音自动识别[J ].昆虫学报,2012,55(4):466471.[8]石文雷,樊新海,张传清.基于频谱动态特征和C S S VM 的装甲车辆识别[J ].计算机应用,2018,38(S 1):4447,72.[9]董语诗,时浏艺,丁一坤.基于HMM 的声场景分类[J ].信息化研究,2018,44(3):3947,52.[10]中兴通讯采用英特尔F P G A 在深度学习上取得性能突破[J ].单片机与嵌入式系统应用,2017,17(3):88.[11]庞悦,赵威,张雅楠,等.基于深度学习的L S T M 的交通流量预测[J ].单片机与嵌入式系统应用,2019,19(3):7275.[12]王枫,陈小平.C N N 深度学习的验证码识别及A n d r o i d 平台移植[J ].单片机与嵌入式系统应用,2019,19(7):2022,73.[13]P I R O T T A E ,M E R C HA N T N D ,T HOM P S O N P M ,e t a l .Q u a n t i f y i n g th e e f f e c t o f b o a t d i s t u r b a n c e o n b o t t l e n o s e d o l -p h i n f o r a g i n g a c t i v i t y[J ].B i o l C o n s e r v ,2015(181):8289.[14]N g u y e n T ,P e r n k o pf F .A c o u s t i c S c e n e C l a s s i f i c a t i o n w i t h M i s m a t c h e d R e c o r d i ng D e v i c e s U s i n g M i x t u r e o f E x pe r t s L a ye r [C ]//2019I E E E I n t e r n a t i o n a l C o nf e r e n c e o n M u l t i -m e d i a a n d E x po (I C M E ),2019.[15]M e s a r o s A ,H e i t t o l a T ,V i r t a n e n T.A m u l t i d e v i c e d a t a s e tf o r u r b a n a c o u s t i c s c e n e c l a s s i f i c a t i o n [J ].2018,a r X i v :1807.09840.[16]S a l a m o n J ,J a c o b y C ,B e l l o J P .A D a t a s e t a n d T a x o n o m yf o r U r b a n S o u n d R e s e a r c h [C ]//a c m I n t e r n a t i o n a l C o n f e r e n c eo n M u l t i m e d i a ,2014.[17]S A L AMO N J ,J A C O B Y C ,B E L L O J P .A D a t a s e t a n d T a x -o n o m y f o r U r b a n S o u n d R e se a r c h [C ]//p r o c e e d i n gs o f t h e a c m I n t e r n a t i o n a l C o n f e r e n c e o n M u l t i m e d i a ,2014.王鹏程(硕士研究生),主要研究方向为信息探测与处理㊂(责任编辑:薛士然 收稿日期:2020-07-20) [2]胡振波.R I S C V 架构与嵌入式开发快速入门[M ].北京:人民邮电出版社,2019.[3]何小庆.3种物联网操作系统分析与比较[J ].微纳电子与智能制造,2020(3).[4]D A V I D P A T T E R S O N ,A N D R E W W A T E R M A N.R I S CV手册:一本开源指令集的指南,2018.[5]U s i n g Fr e e R T O S o n R I S C V M i c r o c o n t r o l l e r s [E B /O L ].[202009].h t t p s ://w w w.f r e e r t o s .o r g /U s i n g Fr e e R T O S o n R I S C V.h t m l .[6]J i m C o o l i n g .R e a l t i m e O p e r a t i n g S ys t e m s B o o k 2T h e P r a c t i c e [M ].M a r k f i e l d :L i n d e n t r e e A s s o c i a t e s ,2017.(责任编辑:芦潇静 收稿日期:2020-09-10)。
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,其余的几个文件功能都是可选的,例如软件定时器、队列、协程等等,小灯就不介绍了,有兴趣的话可以到官网上看介绍。
STM32 系列MCU 不同型号的移植步骤解析
STM32系列MCU不同型号的移植!
第一步
更换启动件:
第二步
修改宏定义:
图1
或者修改stm32f10x.h
具体修改如下:
图2
第三步
修改系统主频率:
文件:system_stm32f10x.c
具体修改如下:
图3
第四步
修改外部晶振源:
文件:stm32f10x.h
其中,Project.bin和Project.axf要和Output选项卡中的Nameof
Executable的名字相同
三、如何使用IAP
1、设置超级终端波特率选择为115200
2、需要下载时将Tamper键按住再按下复位键超级终端打印出帮助信息
3、选择下发文件,协议选择Y_modem,选择下发。
延时修改
使用J-Link调试设置
图7
J-Link不能正常连接目标板
可以尝试一下方法(恢复出厂设置)
具体修改如下:
图4
第五步
定时器需要根据以上修改的系统主频率进行对应的修改。
其他:
修改Flash地址
文件:misc.h
具体修改如下:
图5
与以下配置一致:
IAP设置步骤
一、IAP工程设置
1、修改main中的按键触发键
2、修改下载串口
二、下载工程设置
1、修改程序入口地址
查找NVIC_VectTab_FLASH将其修改为:0x08002000
2、修改options
1)打开Target选项卡在IROM1中将Start和Size分别修改为
0x08002000和0x3E00
2)打开User选项卡在RunUserProgramsBeforeBuild/Rebuild中,勾选
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(纯净版)
因为我们使用 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项目案例可以是一个使用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 freertos 中断写法
在STM32微控制器上使用FreeRTOS实时操作系统时,中断服务例程(ISR)的写法需要遵循一定的规范,以确保中断处理能够在不同的任务之间正确地进行。
以下是一些基本步骤和注意事项,用于在FreeRTOS中实现中断服务例程:1. **中断向量表初始化**:在系统启动时,需要初始化中断向量表,将中断处理函数的地址映射到相应的中断号上。
2. **中断优先级设置**:在FreeRTOS中,可以通过NVIC(嵌套向量中断控制器)设置中断的优先级。
在中断服务例程中,可以使用`HAL_NVIC_SetPriority`函数设置优先级。
3. **中断使能**:在中断服务例程编写完成后,需要使用`HAL_NVIC_EnableIRQ`或`HAL_NVIC_Enable`函数使能中断。
4. **中断服务例程的原型**:中断服务例程应该有一个原型,其中包含了中断号和中断服务例程的函数指针。
5. **在中断服务例程中保护现场**:在进入中断服务例程之前,应该保存CPU的状态,包括程序计数器和其他必要的寄存器,以防止中断服务例程被其他中断打断。
6. **中断服务例程的退出**:在中断服务例程结束时,应该恢复之前保存的状态,并使用`HAL_NVIC_DisableIRQ`或`HAL_NVIC_Disable`函数禁用中断。
7. **使用FreeRTOS的API**:如果需要在中断服务例程中使用FreeRTOS的API,比如创建任务、等待消息等,应该确保这些操作不会导致中断被禁止的时间过长,以免影响系统的响应性。
以下是一个简单的STM32中断服务例程的示例代码:```cvoid EXTI0_IRQHandler(void) {// 保存状态HAL_NVIC_DisableIRQ(EXTI0_IRQn); // 禁用中断// 中断处理逻辑// ...// 恢复状态HAL_NVIC_EnableIRQ(EXTI0_IRQn); // 使能中断} ```。
STM32F407VET6基于FreeRTOS实时操作系统和LAN8720网卡移植LwIP协议栈
STM32F407VET6基于FreeRTOS实时操作系统和LAN8720⽹卡移植LwIP协议栈本次实验是在STM32F407VET6单⽚机上实现FreeRTOS实时操作系统加LwIP协议栈驱动LAN8720⽹卡,板⼦是购买的最⼩系统开发板,⽹卡是购买的LAN8720模块。
使⽤的LwIP内核版本为 lwip-1.4.1,FreeRTOS内核版本为 FreeRTOSv10.2.1。
使⽤上⼀篇博客中移植好的FreeRTOS⼯程。
1、STM32F407VET6单⽚机引脚与LAN8720⽹卡的物理连接如下: a、ETH_RMII_REF_CLK-------> PA1--------->nINT/RETCLK b、ETH_MDIO --------------------> PA2--------->MDIO c、ETH_RMII_CRS_DV --------> PA7--------->CRS d、ETH_RMII_TX_EN ----------> PB11------->TX_EN e、ETH_RMII_TXD0 ------------> PB12------->TX0 f、ETH_RMII_TXD1 -------------> PB13------->TX1 g、ETH_RESET-------------------> PC0-------->NC h、ETH_MDC ---------------------> PC1-------->MDC i、ETH_RMII_RXD0 -------------> PC4-------->RX0 j、ETH_RMII_RXD1 -------------> PC5-------->RX1 注:在⽹卡模块上RESET引脚为NC,未连接,但在实际项⽬中把RESET引脚连接起来使⽤效果更好,LAN8720⽹卡的电源建议加⼀个电源控制,如:三极管或MOS管,在复位前先断⼀下电源,再复位,因为实际中我遇到过软复位不成功的情况。
基于STM32F107的FreeRTOS移植
第8章基于STM32F107的FreeRTOS移植本章以FreeRTOS在STM32F107上的移植为主要内容,介绍移植的主要工作内容,及移植过程需要注意的事项。
8.1 概述FreeRTOS的实现主要由list.c、queue.c、croutine.c和tasks.c 4个文件组成。
list.c 是一个链表的实现,主要供给内核调度器使用;queue.c 是一个队列的实现,支持中断环境和信号量控制;croutine.c 和task.c是两种任务的组织实现。
协程(英文为croutine)是采用各任务共享同一个堆栈,使RAM的需求进一步缩小,但也正因如此,他的使用受到相对严格的限制。
而task则是传统的实现,各任务使用各自的堆栈,支持完全的抢占式调度。
FreeRTOS的主要功能可以归结为以下几点:优先级调度、相同优先级任务的轮转调度,同时可设成可剥夺内核或不可剥夺内核任务可选择是否共享堆栈(co-routines & tasks),并且没有任务数限制消息队列,二值信号量,计数信号量,递归互斥体时间管理内存管理与UC/OS-II一样,FreeRTOS在STM32的移植大致由3个文件实现,一个.h文件定义编译器相关的数据类型和中断处理的宏定义;一个.c文件实现任务的堆栈初始化、系统心跳的管理和任务切换的请求;一个.s文件实现具体的任务切换。
在本次移植中,使用的编译软件为IAR EWARM 6.3。
8.2 FreeRTOS移植8.2.1 portmacro.h头文件PORTMACRO.H头文件主要包括两部分内容。
第一部分定义了一系列内核代码中用到的数据类型。
FreeRTOS与uC/OS-II一样,并不直接使用char、int 等这些原生数据类型,而是将其重新定义为一系列以port开头的新类型。
这样的好处在于,在不同架构的处理器移植时,仅需针对处理器的位宽对这些数据类型做相应的调整,而无需繁琐地从头至尾修改源代码。
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 的移植
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
• 设置中断优先级 • 配置心跳时钟
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。
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函数整理,删除很多注释之后,得到下图所示内容。
cubeide的freertos例程
cubeide的freertos例程
CubeIDE是一个集成开发环境,用于开发基于STM32微控制器的嵌入式应用程序。
它提供了丰富的功能和库,使开发人员能够轻松地使用FreeRTOS实现多任务处理。
在CubeIDE中,FreeRTOS是一个非常有用的功能,它可以帮助开发人员实现并发执行的任务。
通过使用FreeRTOS,开发人员可以将应用程序划分为多个任务,每个任务都可以并行运行,从而提高系统的效率和响应速度。
使用CubeIDE的FreeRTOS例程,开发人员可以学习如何创建任务、管理任务的优先级、同步任务之间的通信等。
例如,开发人员可以创建一个任务来处理传感器数据的读取,另一个任务来处理数据的处理和分析,还可以创建一个任务来控制外设的操作。
通过合理地划分任务和设置任务的优先级,可以确保系统的稳定性和性能。
在CubeIDE的FreeRTOS例程中,还可以学习如何使用信号量、消息队列和互斥锁等机制来实现任务之间的同步和通信。
例如,开发人员可以使用信号量来保护共享资源,确保多个任务不会同时访问同一个资源。
开发人员还可以使用消息队列来实现任务之间的消息传递,实现数据的共享和同步。
CubeIDE的FreeRTOS例程为开发人员提供了一个学习和实践的平台,帮助他们更好地理解和应用FreeRTOS。
通过使用CubeIDE的
FreeRTOS例程,开发人员可以提高嵌入式应用程序的质量和性能,实现更高效、可靠的系统。
freertos项目案例
freertos项目案例FreeRTOS项目案例。
在嵌入式系统开发中,实时操作系统(RTOS)扮演着至关重要的角色。
FreeRTOS作为一款开源的RTOS,被广泛应用于各种嵌入式设备中,包括工业控制、汽车电子、医疗设备等领域。
本文将通过一个具体的案例来介绍FreeRTOS在嵌入式系统开发中的应用。
案例背景。
假设我们要开发一个智能家居控制器,该控制器需要实现多个传感器数据的采集、数据处理和对外通信。
为了保证系统的实时性和稳定性,我们选择使用FreeRTOS作为控制器的操作系统。
任务划分。
首先,我们需要对系统的功能进行分析和任务划分。
根据需求,我们将系统划分为以下几个任务:1. 传感器数据采集任务。
2. 数据处理任务。
3. 通信任务。
任务优先级。
在FreeRTOS中,任务的优先级决定了任务的执行顺序。
为了保证系统的实时性,我们需要合理地设置任务的优先级。
在本案例中,我们将传感器数据采集任务设置为最高优先级,数据处理任务设置为中等优先级,通信任务设置为最低优先级。
任务实现。
接下来,我们将分别实现每个任务。
在FreeRTOS中,任务的实现通常包括任务的创建、任务的调度和任务的删除。
以传感器数据采集任务为例,我们可以通过以下代码来创建一个任务:```c。
void vSensorTask(void pvParameters)。
{。
for(;;)。
{。
// 传感器数据采集。
// ...vTaskDelay(pdMS_TO_TICKS(1000)); // 1秒的延时。
}。
}。
```。
数据处理任务和通信任务的实现类似,只需要根据具体的需求编写相应的代码即可。
任务调度。
在任务实现完成后,我们需要将任务添加到FreeRTOS的调度器中。
通过调度器,FreeRTOS可以根据任务的优先级和状态来动态地调度任务的执行。
在本案例中,我们只需要在系统初始化时调用vTaskStartScheduler()函数即可启动任务调度。
rtos移植流程
rtos移植流程
RTOS移植是将RTOS系统从一个平台移植到另一个平台的过程,通常需要进行以下步骤:
1. 硬件适配:需要根据新平台的硬件特性,进行底层硬件适配,包括中断控制、时钟管理、IO口控制等。
2. 内存管理:因为不同平台的内存结构可能不同,需要进行内存管理的适配。
3. 系统调度:需要根据新平台的特性进行系统调度的改进和优化,以充分利用新平台的硬件资源。
4. 驱动移植:需要将原有平台的驱动程序进行移植,并进行相应的适配。
5. 应用程序适配:需要将应用程序进行适配,以充分利用新平台的硬件资源,同时保证应用程序的稳定性和可靠性。
总之,RTOS移植是一个比较复杂的过程,需要对原有的系统进行深入的了解,同时也需要对新平台的特性进行充分了解,才能完成一个高质量的RTOS移植工作。
- 1 -。