(rtos 数值分析学习指导 模式)中“模式”指的是什么

1116人阅读
RTOS---(4)OSE/OSEck RTOS完全注释(1)
一、瑞典RTOS供应商Enea公司(OSE/OSEck RTOS)
&&&&&&&详情请参考:Enea公司官网:
&&&&&&&& Enea&OSE是一款稳定、高性能的实时操作系统,它专门针对要求真正的确定性实时行为和高可用性的多处理器系统进行了优化。对于从手机和汽车到医疗仪器和电信基础设施的许多系统,它缩短了研发时间,提高了可靠性并降低了生命周期维护成本。
<span style="color:#. 针对手机应用处理器的OS(如Windows Mobile\Windows CE\Symbian\Linux和Android) 在实时性能上要差一些。
<span style="color:#.针对手机基带处理器的RTOS:
OSE 是一个紧凑的、可靠的、高性能的RTOS,专门针对分布式容错多内核系统进行了优化。它的目标应用市场是对实时响应性能要求非常高的手机基带处理器和基站用户线路接入卡,尤其适用于基于多内核处理器或分布式的多处理器的应用场合。
&&& & & 2008年全球有4亿部新手机采用了Enea公司的OSE/OSEck RTOS来实现,同时OSE/OSEck RTOS也被用在全球约50%的基站设备里,而且客户大多是全球第一流的系统供应商,包括:爱立信、诺基亚、诺基亚-西门子,
Alcatel-Lucent、摩托罗拉、富士通、Infineon、Agere、波音、三星、索&#23612;-爱立信、Yamaha、华为、中兴、大唐和中国普天等。
&&&&&&&& “OSE 在手机基带市场上可以说是一枝独秀。”Enea 公司亚太区副总裁Dan Andersson 很自豪地说:“OSE 是一种模块化的解决方案,适用于从超低成本手机到智能手机的全部手机市场。它既支持DSP、RISC基带处理器和应用处理器,又支持包括Linux在内(OSE 虚拟机技术)的任一应用OS,可扩展性和移植性非常好,是一种非常好的长远投资选择。”
OSE 经久不衰的成功奥秘是它的模块化、分层架构和直接异步消息传递设计。这一内在的分布式架构在确保高性能的同时,允许程序员对复杂的应用进行概括、分割和开发,这类应用可以是单一CPU系统,也可以是大型的、分布式多CPU和多内核系统。
&&&&&&&&&& Enea 还可提供一个可选的OSE仿真环境,即OSE Soft Kernel,它允许OSE进程运行在Windows、Linux或Solaris宿主机上。它也可以与一个运行中的实时系统一起工作。这使得设计人员能够建立混合式软/硬件OSE目标环境,从而使得设计师可以在宿主机上运行一部分应用,并在硬件到位后移植到真正的目标板上。
&&&&&&&&&& 多核处理器对OS的挑战是,OS也被要求并行地工作。对多核RTOS的要求是必须为最大程度地发挥出多核应用的性能提供非常好的支持,以及支持扩展到更多内核的处理器,同时保持标准的RTOS实时特性,如响应确定性和中断时延。RTOS(实时操作系统)必须提供一种简单的、灵活的和统一的编程环境,它可以提供下列功能,如负载平衡、启动加载、文件系统和联网。
&&&&&&&&&& OSE 有四大独特技术优势,分别是:可移植性好、可扩展性好、更高性能和更好响应确定性。&
二、瑞典RTOS供应商Enea公司(OSE/OSEck RTOS)技术详解
&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&
<span style="color:#.纯SMP模式的缺点
&&&&&& SMP(对称多处理) 模式指采用一个RTOS来管理一个处理器上的所有同类内核,或一块板子上的多个同类处理器。这种模式需要很多个不同的锁定机制,并需要频繁进行同步操作。从软件管理角度来看,SMP 模式是非常容易管理的,因为它创建了一个高度抽象的硬件资源,从而很容易实现各CPU上的负载平衡。
&&&&&& 在很多情况下,高度抽象的硬件资源是一种优势,但当某个应用的I/O变得非常密集时(如在嵌入式数据报转发/路由应用中),这一抽象层就会带来很大的开销。在应用层上的共享存储编程模型的原则是基于使用存储器中可变的共享对象,这对多核系统的可扩展性来说是一种固有的瓶颈。这将不可避免地导致很难扩展到更多的内核。
&&&&&&&& 这一点,再加上在许多情况下用SMP来实现多个内核比较复杂这样一个事实,使得采用SMP模式的多处理器系统的响应确定性不是那么好,从长期角度来看,这也使得传统的SMP模式不太适合用来实现高速数据包处理应用。
<span style="color:#.纯AMP模式的缺点
&&& && AMP(非对称多处理)模式使用的方法是,每个内核都运行一个属于它自己的完整的、单独的操作系统或应用框架(一种简化版RTOS的替代说法)。这种模式允许不同内核运行不同的RTOS。AMP系统的优势是每个内核可实现高性能,以及它可很好地扩展到多个内核。使用AMP模式和虚拟化技术也是一个能够复用传统单核设计的办法。
&&&&&&& AMP模式的缺点是OS不能为分布式应用的负载平衡或OS资源管理提供支持。此外,采用AMP模式应用的配置、加载和启动也具有内在的设计复杂性。
<span style="color:#.OSE混合模式的独特优势
&&&&&&& OSE 采用了独特的SMP(对称多处理)和AMP(非对称多处理)混合模式来实现最大的设计灵活性,这一模式既可克服AMP模式或SMP模式的缺点,又可以融合它们各自的优点,OSE 的这种独特的多核设计架构可以提供裸机(Bare Metal)模式的性能,并同时保有SMP模式的易用性和AMP模式的可扩展性及确定性。OSE 的多核支持可为以前的OSE应用提供完全的向后兼容性,从而使得用户可以保护它的软件投资。
&&&&&&&& OSE 是 一个真正的分布式操作系统,它使用了一个基于消息的编程模型,这可提供应用位置的透明性。OSE 架构是一个非常模块化和可扩展的架构,由运行在一个微内核顶部的大量运行时组件构成。
&&&&&&&& OSE 内核的开发基础是进程之间的消息交换,这一进程间通信(IPC)机制是OSE编程模型的基础,它的实现形式是一个简单的API,用于分布式系统上不同进程/线程之间的消息交换,这些进程/线程可运行一个、或几个处理器节点上。OSE 还提供了一个寻址模式来实现应用的可扩展性,这使得一个系统可以运行在一个处理器节点上或分布式集群的多个节点上,而无须改变程序代码。
&&&&&&&& 当多处理器在物理上是分开的时,OSE 内核使用IPC协议LINX传递消息。LINX 可使得基于同一背板的不同插卡上的处理器、同一插卡上的不同处理器、以及同一芯片上的不同内核之间相互之间保持透明度,它使得用户很容易实现负载平衡。
<span style="color:#.OSE 同时支持 RISC CPU和DSP
(1).Enea OSE组成
Enea OSE 由OSE Delta、OSEck、OSE Epsilon、Optima和LINX组成:
&&&&&&&&&&&&& OSE Delta支持大部分的 RISC CPU,包括:ARM、XScale、MIPS、PowerPC;
&&&&&&&&&&&&& OSEck 是 Enea 专门为DSP优化而设计的内核;
&&&&&&&&&&&&& OSE Epsilon支持MCU和SoC,该内核100%用汇编编写,因此占用存储空间极小;
&&&&&&&&&&&&& Optima是基于Eclipse的集成开发环境或工具,主要用于开发应用程序;
&&&&&&&&&&&&& LINX 是一个分布式处理器间或多个处理器内核间进行通信的中间件。
(2).Enea OSE支持架构
&&&&&&&& 在RISC处理器方面,目前最新的OSE支持XScale、ARM、PowerPC和MIPS32架构的RISC处理器,包括:ARM7、ARM9E、ARM10、ARM11、XScale、IBM
PowerPC4xx、IBM PowerPC7xx、Intel网络处理器IXP、Freescale MPC86xx (支持多核MPC8641D)、Freescale MPC85xx(支持多核MPC8572DS)、Freescale MPC83xx、Freescale MPC82xx、Freescale MPC74xx、TI所有OMAP处理器和MIPS32/64处理器。
&&&&&&&&& 在DSP方面,OSE 支持TI的所有DSP器件和内核、Freescale MSC8101/03、Freescale MSC、Freescale MSC8144、SC120/SC1200、SC140/SC1400、SC2400/SC3400、ADI TigerSHARC (TS101S and TS201S)、ADI Blackfin、Freescale
MPC5xx/55xx、LSI Logics ZSP400/500、STMicroelectronics ST100/120/…、Agere Systems dsp16k、CEVA 的 DSP 及其内核。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:129082次
积分:1714
积分:1714
排名:第19105名
原创:21篇
转载:151篇
(26)(57)(42)(31)(16)
test for ****【FreeRTOS操作系统教程】第33章&&FreeRTOS低功耗之tickless模式
第33章&&&&
&FreeRTOS低功耗之tickless模式
本文完整版地址:
本章节为大家讲解FreeRTOS本身支持的低功耗模式tickless实现方法,tickless低功耗机制是当前小型RTOS所采用的通用低功耗方法,比如embOS,RTX和uCOS-III(类似方法)都有这种机制。
本章教程配套的例子含Cortex-M3内核的STM32F103和Cortex-M4内核的STM32F407以及F429。
33.1 tickless低功耗模式介绍
33.2 FreeRTOS的低功耗模式介绍
33.3 FreeRTOS的低功耗模式配置
33.4 FreeRTOS实现tickless模式的框架
33.5 实验例程说明
33.6&&&&&&
tickless低功耗模式介绍
tickless低功耗机制是当前小型RTOS所采用的通用低功耗方法,比如embOS,RTX和uCOS-III(类似方法)都有这种机制。
FreeRTOS的低功耗也是采用的这种方式,那么tickless又是怎样一种模式呢?仅从字母上看tick是滴答时钟的意思,less是tick的后缀,表示较少的,这里的含义可以表示为无滴答时钟。整体看这个字母就是表示滴答时钟节拍停止运行的情况。
反映在FreeRTOS上,tickless又是怎样一种情况呢?我们都知道,当用户任务都被挂起或者阻塞时,最低优先级的空闲任务会得到执行。那么STM32支持的睡眠模式,停机模式就可以放在空闲任务里面实现。为了实现低功耗最优设计,我们还不能直接把睡眠或者停机模式直接放在空闲任务就可以了。进入空闲任务后,首先要计算可以执行低功耗的最大时间,也就是求出下一个要执行的高优先级任务还剩多少时间。然后就是把低功耗的唤醒时间设置为这个求出的时间,到时间后系统会从低功耗模式被唤醒,继续执行多任务。这个就是所谓的tickless模式。从上面的讲解中可以看出,实现tickless模式最麻烦是低功耗可以执行的时间如何获取。关于这个问题,FreeRTOS已经为我们做好了。
33.2&FreeRTOS的低功耗模式介绍
对于Cortex-M3和M4内核来说,FreeRTOS已经提供了tickless低功耗代码的实现,通过调用指令WFI实现睡眠模式,具体代码的实现就在port.c文件中,用户只需在FreeRTOSConfig.h文件中配置
宏定义configUSE_TICKLESS_IDLE为1即可。如果配置此参数为2,那么用户可以自定义tickless低功耗模式的实现。当用户将宏定义configUSE_TICKLESS_IDLE配置为1且系统运行满足以下两个条件时,系统内核会自动的调用低功耗宏定义函数portSUPPRESS_TICKS_AND_SLEEP():
-------------------------------
(1)当前空闲任务正在运行,所有其它的任务处在挂起状态或者阻塞状态。
(2)根据用户配置configEXPECTED_IDLE_TIME_BEFORE_SLEEP的大小,只有当系统可运行于低功耗模式的时钟节拍数大于等于这个参数时,系统才可以进入到低功耗模式。此参数默认已经在FreeRTOS.h文件进行定义了,下面是具体的定义内容,当然,用户也可以在FreeRTOSConfig.h文件中重新定义:
configEXPECTED_IDLE_TIME_BEFORE_SLEEP
#define configEXPECTED_IDLE_TIME_BEFORE_SLEEP 2
#if configEXPECTED_IDLE_TIME_BEFORE_SLEEP &
#error configEXPECTED_IDLE_TIME_BEFORE_SLEEP must
not be less than 2
默认定义的大小是2个系统时钟节拍,且用户自定义的话,不可以小于2个系统时钟节拍。
---------------------------------
函数portSUPPRESS_TICKS_AND_SLEEP是FreeRTOS实现tickles模式的关键,此函数被空闲任务调用,其定义是在portmacro.h文件中:
#ifndef portSUPPRESS_TICKS_AND_SLEEP
extern void vPortSuppressTicksAndSleep( TickType_t
xExpectedIdleTime );
#define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime )
vPortSuppressTicksAndSleep( xExpectedIdleTime )
其中函数vPortSuppressTicksAndSleep是实际的低功耗执行代码,在port.c文件中定义,参数xExpectedIdleTime就是系统可以处于低功耗模式的系统时钟节拍数。
FreeRTOS在线电子手册低功耗的说明。
33.3&FreeRTOS的低功耗模式配置
关于FreeRTOS低功耗方面的配置主要涉及到以下几个问题。
33.3.1滴答定时器频率与系统主频的关系
对于Cortex-M3和M4内核的微控制器来说,实时操作系统一般都是采用滴答定时器做系统时钟,FreeRTOS也不例外。SysTick滴答定时器是一个24bit的递减计数器,有两种时钟源可选择,一个是系统主频,另一个是系统主频的八分频,默认的port.c移植文件中是用的系统主频。这里我们就根据这两种时钟源来说一说配置上的不同。
(1)SysTick滴答定时器时钟源选择系统主频
如果滴答定时器选择系统主频的话,那么需要配置configSYSTICK_CLOCK_HZ等于configCPU_CLOCK_HZ,这种关系已经在port.c文件中进行默认配置了:
#ifndef configSYSTICK_CLOCK_HZ
#define configSYSTICK_CLOCK_HZ configCPU_CLOCK_HZ
#define portNVIC_SYSTICK_CLK_BIT ( 1UL && 2UL )
#define portNVIC_SYSTICK_CLK_BIT ( 0 )
其中系统主频configCPU_CLOCK_HZ是在FreeRTOSConfig.h文件中进行定义的。
(2)SysTick滴答定时器时钟源选择系统主频的八分频
这种情况的话,需要用户在FreeRTOSConfig.h文件中专门配置configSYSTICK_CLOCK_HZ为实际的频率,即系统主频的八分频大小。
33.3.2系统时钟节拍不使用滴答定时器
这种情况我们这里不做讨论,用户看FreeRTOS官网此处的说明即可:
33.3.3如何使用微控制器其它低功耗模式
前面我们说了,对Cortex-M3和M4内核来说,FreeRTOS自带的低功耗模式是通过指令WFI让系统进入睡眠模式,如果想让系统进入停机模式,又该怎么修改呢?FreeRTOS为我们提供了两个函数:
configPRE_SLEEP_PROCESSING( xExpectedIdleTime )
configPOST_SLEEP_PROCESSING( xExpectedIdleTime )
这两个函数的定义是在FreeRTOS.h文件中定义的,什么都没有执行:
#ifndef configPRE_SLEEP_PROCESSING
#define configPRE_SLEEP_PROCESSING( x )
#ifndef configPOST_SLEEP_PROCESSING
#define configPOST_SLEEP_PROCESSING( x )
如果需要实际执行代码需要用户在FreeRTOSConfig.h文件中重新进行宏定义,将其映射到一个实际的函数中。另外,这两个函数是在port.C文件中被函数vPortSuppressTicksAndSleep调用,具体位置如下:
&&&&&&&&&&&&&
xModifiableIdleTime = xExpectedIdleT
&&&&&&&&&&&&&
configPRE_SLEEP_PROCESSING(
xModifiableIdleTime );
&&&&&&&&&&&&&
if( xModifiableIdleTime & 0 )
&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&
__dsb( portSY_FULL_READ_WRITE );
&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&
__isb( portSY_FULL_READ_WRITE );
&&&&&&&&&&&&&
&&&&&&&&&&&&&
configPOST_SLEEP_PROCESSING(
xExpectedIdleTime );
这两个函数位于指令wfi的前面和后面,用户想实现其它低功耗方式的关键就在这两个函数里面:
(1)configPRE_SLEEP_PROCESSING(
xExpectedIdleTime )
执行低功耗模式前,用户可以在这个函数里面关闭外设时钟来进一步降低系统功耗。设置其它低功耗方式也是在这个函数里面,用户只需设置参数xExpectedIdleTime=0即可屏蔽掉默认的wfi指令执行方式,因为退出这个函数后会通过if语句检测此参数是否大于0,即上面的代码所示。因此,如果用户想实现其它低功耗模式还是比较方便的,配置好其它低功耗模式后,设置参数
xExpectedIdleTime = 0即可,但切不可将此参数随意设置为0以外的其它数值。
(2)configPOST_SLEEP_PROCESSING
( xExpectedIdleTime )
退出低功耗模式后,此函数会得到调用,之前在configPRE_SLEEP_PROCESSING里面关闭的外设时钟,可以在此函数里面重新打开,让系统恢复到正常运行状态。
33.4FreeRTOS实现tickless模式的框架
对Cortex-M3和M4内核的微控制器来说,FreeRTOS已经提供了tickless低功耗模式的代码,对于没有支持的微控制器,用户可以在FreeRTOSConfig.h文件中配置portSUPPRESS_TICKS_AND_SLEEP宏定义,来映射实际执行函数。
如果用户不想使用FreeRTOS提供的的tickless也可以自定义,方法也是在FreeRTOSConfig.h文件中配置portSUPPRESS_TICKS_AND_SLEEP宏定义,来映射实际执行函数。
下面是FreeRTOS实现低功耗tickless模式的代码框架,方便用户对tickles模式有一个认识,同时也方便FreeRTOS没有支持的微控制器,用户可以参考实现。当然,不局限于这种方法,用户有更好的方法,也可以的。其中函数vTaskStepTick和eTaskConfirmSleepModeStatus是FreeRTOS提供的,其余的函数是需要用户实现的。
#define portSUPPRESS_TICKS_AND_SLEEP( xIdleTime )
vApplicationSleep( xIdleTime )
void vApplicationSleep( TickType_t
xExpectedIdleTime )
unsigned long ulLowPowerTimeBeforeSleep,
ulLowPowerTimeAfterSleep;
eSleepModeStatus eSleepS
ulLowPowerTimeBeforeSleep = ulGetExternalTime();
prvStopTickInterruptTimer();
disable_interrupts();
eSleepStatus = eTaskConfirmSleepModeStatus();
if( eSleepStatus == eAbortSleep )
prvStartTickInterruptTimer();
enable_interrupts();
if( eSleepStatus == eNoTasksWaitingTimeout )
&&&&&&&&&&&
&&&&&&&&&&&
prvSleep();
&&&&&&&&&&&
vSetWakeTimeInterrupt( xExpectedIdleTime );
&&&&&&&&&&&
prvSleep();
&&&&&&&&&&&
ulLowPowerTimeAfterSleep = ulGetExternalTime();
&&&&&&&&&&&
&&&&&&&&&&&
vTaskStepTick( ulLowPowerTimeAfterSleep &ulLowPowerTimeBeforeSleep );
enable_interrupts();
prvStartTickInterruptTimer();
33.5实验例程说明
33.5.1STM32F103开发板实验
配套例子:
V4-339_FreeRTOS实验_低功耗(tickless之睡眠模式)
实验目的:
学习FreeRTOS的低功耗(tickless之睡眠模式)。
FreeRTOS自带的tickless模式使用比较简单,只需用户使能宏配置:
configUSE_TICKLESS_IDLE&&&&&&&&
为了打印系统信息,前面的所有实验中初始化了一个定时器中断,精度高于滴答定时器中断,每50us进一次中断,本例子关闭了任务执行情况打印功能,因为高频率的定时器中断会影响低功耗tickless模式效率。
实验内容:
K1按键按下,串口打印任务执行情况(波特率115200,数据位8,奇偶校验位无,停止位1)。
FreeRTOS自带的tickless模式是调用的指令__WFI进入睡眠模式。
各个任务实现的功能如下:
&&&&&&&&&&&&&
vTaskUserIF任务&&
:按键消息处理。
&&&&&&&&&&&&&
vTaskLED任务&&&&
:LED闪烁。
&&&&&&&&&&&&&
vTaskMsgPro任务
:消息处理,这里用作LED闪烁。
&&&&&&&&&&&&&
vTaskStart任务&&&
:启动任务,也是最高优先级任务,这里实现按键扫描。
设计低功耗主要从以下几方面着手:
用户需要根据最低电源消耗、最快速启动时间和可用的唤醒源等条件,选定一个最佳的低功耗模式。可以使用的低功耗方式有睡眠模式,待机模式,停机模式。
选择了低功耗方式后就是关闭可以关闭的外设时钟。
降低系统主频。
注意I/O的状态。
如果此I/O口带上拉,请设置为高电平输出或者高阻态输入。
如果此I/O口带下拉,请设置为低电平输出或者高阻态输入。
在睡眠模式下,所有的I/O引脚都保持它们在运行模式时的状态。
在停机模式下,所有的I/O引脚都保持它们在运行模式时的状态。
在待机模式下,所有的I/O引脚处于高阻态,除了以下的引脚:
复位引脚(始终有效)。
当被设置为防侵入或校准输出时的TAMPER引脚。
被使能的唤醒引脚。
注意I/O和外设IC的连接。
测低功耗的时候,一定不要连接调试器,更不能边调试边测电流。
FreeRTOS的配置:
FreeRTOSConfig.h文件中的配置如下:
#if defined(__ICCARM__) || defined(__CC_ARM) ||
defined(__GNUC__)
&extern volatile uint32_t
ulHighFrequencyTimerTicks;
configUSE_PREEMPTION&&&&&&&&
configUSE_IDLE_HOOK&&&&&&&&&
configUSE_TICK_HOOK&&&&&&&&&
configCPU_CLOCK_HZ&&&&&&&&&&
( ( unsigned long )
configTICK_RATE_HZ&&&&&&&&&&
( ( TickType_t ) 1000 )
configMAX_PRIORITIES&&&&&&&&
#define configMINIMAL_STACK_SIZE&
&& ( ( unsigned short ) 128
configTOTAL_HEAP_SIZE&&&&&&&
( ( size_t ) ( 17 * 1024 ) )
configMAX_TASK_NAME_LEN&&&&&
#define configUSE_TRACE_FACILITY
configUSE_16_BIT_TICKS&&&&&&
configIDLE_SHOULD_YIELD&&&&&
configUSE_TICKLESS_IDLE&&&&&
#define configUSE_CO_ROUTINES
#define configMAX_CO_ROUTINE_PRIORITIES ( 2
INCLUDE_vTaskPrioritySet&&&&
INCLUDE_uxTaskPriorityGet&&&&&&&&
INCLUDE_vTaskDelete&&&&&&&&&&&&&&
#define INCLUDE_vTaskCleanUpResources
INCLUDE_vTaskSuspend&&&&&&&&&&&&&
INCLUDE_vTaskDelayUntil&&&&&&&&&&
INCLUDE_vTaskDelay&&&&&&&&&&&&&&&
#ifdef __NVIC_PRIO_BITS
configPRIO_BITS&&&&&&
__NVIC_PRIO_BITS
configPRIO_BITS&&&&&&
configLIBRARY_LOWEST_INTERRUPT_PRIORITY&&&&&&&&&&&&&
configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY&&&
几个重要选项说明:
configUSE_PREEMPTION&&&&&&&
使能抢占式调度器
configCPU_CLOCK_HZ&&&&
( ( unsigned long )
系统主频72MHz。
configTICK_RATE_HZ&&&&&&&&&&&&&
( ( TickType_t ) 1000 )
系统时钟节拍1KHz,即1ms。
configUSE_TICKLESS_IDLE&&&&
使能tickless低功耗模式。
configMAX_PRIORITIES&&&&&&&&&
定义可供用户使用的最大优先级数,如果这个定义的是5,那么用户可以使用的优先级号是0,1,2,3,4,不包含5,对于这一点,初学者要特别的注意。
configTOTAL_HEAP_SIZE&&&&&&&
( ( size_t ) ( 17 * 1024 ) )
定义堆大小,FreeRTOS内核,用户动态内存申请,任务栈等都需要用这个空间。
configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY&&&&&&&&&
定义受FreeRTOS管理的最高优先级中断。简单的说就是允许用户在这个中断服务程序里面调用FreeRTOS的API的最高优先级。为了进一步说明这个宏定义的的作用,解释如下:
使用CM内核的MCU,官方强烈建议将NVIC的优先级分组配置为全抢占式优先级,全部配置为抢占式优先级的好处就是方便管理。
对于STM32来说,设置NVIC的优先级分组为4时,NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4)就是全部配置为抢占式优先级。又因为STM32的优先级设置仅使用CM内核8bit中的高4bit,即只能区分2^4 =
16种优先级。因此当优先级分组设置为4的时候可供用户选择抢占式优先级为0到15,共16个优先级,配置为0表示最高优先级,配置为15表示最低优先级,不存在子优先级。
这里配置configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY为0x01表示用户可以在抢占式优先级为1到15的中断里面调用FreeRTOS的API函数,抢占式优先级为0的中断里面是不允许调用的。
更多关于这个参数说明请参看第12章。
程序设计:
任务栈大小分配:
vTaskUserIF任务&& :2048字节
vTaskLED任务&&&&
:2048字节
vTaskMsgPro任务
:2048字节
vTaskStart任务&&&
:2048字节
任务栈空间是在任务创建的时候从FreeRTOSConfig.h文件中定义的heap空间中申请的
configTOTAL_HEAP_SIZE&&&&&&&
( ( size_t ) ( 17 * 1024 ) )
系统栈大小分配:
FreeROTS初始化:
int main(void)
__set_PRIMASK(1);&
bsp_Init();
AppTaskCreate();
vTaskStartScheduler();
硬件外设初始化
硬件外设的初始化是在bsp.c文件实现:
void bsp_Init(void)
DBGMCU_Config(DBGMCU_SLEEP, ENABLE);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
bsp_InitUart(); &&
bsp_InitLed();
bsp_InitKey();&&&&
FreeRTOS任务创建:
static void AppTaskCreate (void)
xTaskCreate( vTaskTaskUserIF,&&
&&&&&&&&&&&&&&&&
"vTaskUserIF",&&&&
&&&&&&&&&&&&&&&&
512,&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&
&&&&&&&&&&
&&&&&&&&&&&&&&&&
1,&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&
&xHandleTaskUserIF );& /*
xTaskCreate(
vTaskLED,&&&
&&&&&&&&&&&&&&&&
"vTaskLED",&
&&&&&&&&&&&&&&&&
512,&&&&&&&&
&&&&&&&&&&&&&&&&
NULL,&&&&&&&
&&&&&&&&&&&&&&&&
2,&&&&&&&&&&
&&&&&&&&&&&&&&&&
&xHandleTaskLED );
xTaskCreate(
vTaskMsgPro,&&&&
&&&&&&&&&&&&&&&&
"vTaskMsgPro",&&
&&&&&&&512,&&&&&&&&&&&&
&&&&&&&&&&&&&&&&
NULL,&&&&&&&&&&
&&&&&&&&&&&&&&&&
3,&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&
&xHandleTaskMsgPro );& /*
xTaskCreate(
vTaskStart,&&&&
&&&&&&&"vTaskStart",&&
&&&&&&&&&&&&&&&&
512,&&&&&&&&&&&
&&&&&&&&&&&&&&&&
NULL,&&&&&&&&&&
&&&&&&&&&&&&&&&&
4,&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&
&xHandleTaskStart );& &
四个FreeRTOS任务的实现:
static void vTaskTaskUserIF(void
*pvParameters)
uint8_t ucKeyC
ucKeyCode = bsp_GetKey();
if (ucKeyCode != KEY_NONE)
&&&&&&&&&&&&&
switch (ucKeyCode)
&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&
KEY_DOWN_K1:&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&
printf("本例子关闭了任务执行情况打印功能,因为高频率的定时器中断影响低功耗tickless
模式效率\r\n");
&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&
default:&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&
vTaskDelay(20);
static void vTaskLED(void
*pvParameters)
TickType_t xLastWakeT
const TickType_t xFrequency = 200;
xLastWakeTime = xTaskGetTickCount();
bsp_LedToggle(2);
bsp_LedToggle(3);
vTaskDelayUntil(&xLastWakeTime, xFrequency);
static void vTaskMsgPro(void
*pvParameters)
TickType_t xLastWakeT
const TickType_t xFrequency = 400;
xLastWakeTime = xTaskGetTickCount();
bsp_LedToggle(1);
bsp_LedToggle(4);
vTaskDelayUntil(&xLastWakeTime, xFrequency);
static void vTaskStart(void
*pvParameters)
bsp_KeyScan();
vTaskDelay(10);
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。}

我要回帖

更多关于 cpu mark数值是什么 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信