01. µCOS-Ⅲ的简介
一、µC/OS-Ⅲ的简介
1.1、什么是RTOS
操作系统是允许多个任务 “同时运行” 的,操作系统的这个特性被称为多任务。然而实际上,一个 CPU 核心在某一时刻只能运行一个任务,而操作系统中任务调度器的责任就是决定在某一时刻 CPU 究竟要运行哪一个任务,任务调度器使得 CPU 在各个任务之间来回切换并处理任务,由于切换处理任务的速度非常快,因此就给人造成了一种同一时刻有多个任务同时运行的错觉。
操作系统的分类方式可以由任务调度器的工作方式决定,比如有的操作系统给每个任务分配同样的运行时间,时间到了就切换到下一个任务,Unix 操作系统就是这样的。RTOS 的任务调度器被设计为可预测的,而这正是嵌入式实时操作系统所需要的。在实时环境中,要求操作系统必须实时地对某一个事件做出响应,因此任务调度器的行为必须是可预测的。像 µC/OS-Ⅲ 这种传统的 RTOS 类操作系统是由用户给每个任务分配一个任务优先级,任务调度器就可以根据此优先级来决定下一刻应该运行哪个任务。
RTOS 全称为 Real Time OS,就是实时操作系统,它将功能分而治之,划分为多个任务,并且通过延时函数进行任务调度。其中,高优先级任务抢占低优先级任务,并且每个任务都有自己的栈空间。
中断可以打断任意任务。
任务可以同等优先级。
1.2、什么是µC/OS-Ⅲ
µC/OS-Ⅲ 是基于 C 语言编写的第三代小型操作系统,这里所说的第三代是相对于 µC/OS 的前两个版本 µC/OS 和 µC/OS-Ⅱ 而言的。这三个版本的特征比较如下表所示:
µC/OS-Ⅲ 是一个可裁剪、可剥夺的多任务系统,没有任务数目的限制,是 µC/OS 的第三代内核操作系统。
二、任务调度简介
调度器就是使用相关的调度算法来决定当前需要执行哪个任务,µC/OS-Ⅲ 支持以下任务调度方式:抢占式调度 和 时间片调度 。
- 抢占式调度:主要针对优先级不同的任务,每个任务都有一个优先级,优先级高的任务可以抢占优先级低的任务。
- 时间片调度:主要针对优先级相同的任务,当多个任务的优先级相同且就绪时,任务调度器会根据用户所设置的时间片轮流的运行这些任务。
时间片是以一次系统节拍位单位。如 µC/OS-Ⅲ 默认设置的任务片为 100,则 µC/OS-Ⅲ 会在当前任务运行 100 次系统时钟节拍时的时间后,切换到另一个相同任务优先级的任务中运行。
2.1、抢占式调度
在 µC/OS-Ⅲ 中,高优先级任务,优先执行,并且高优先级任务不停止,低优先级任务无法执行。被抢占的任务将会进入就绪态。
首先,这里创建三个任务:Task1、Task2、Task3。Task1、Task2、Task3 的优先级分别为 3、2、1;在 µC/OS-Ⅲ 中任务设置的数值越小,优先级越高,所以 Task3 的优先级最高。
该程序在运行时,首先 Task1 在运行中,在这个过程中 Task2 就绪了,在抢占式调度器的作用下 Task2 会抢占 Task1 的运行。然后,在 Task2 运行过程中,Task3 就绪了,在抢占式调度器的作用下 Task3 会抢占 Task2 的运行。接着,Task3 运行过程中,Task3 阻塞了(系统延时或等待信号量等),此时就绪态中,优先级最高的任务 Task2 执行。随后,Task3 阻塞解除了(延时到了或者接收到信号量),此时 Task3 恢复到就绪态中,抢占 TasK2 的运行。
2.2、时间片调度
同等优先级任务轮流地享有相同的 CPU 时间(可设置), 叫时间片,在 µC/OS-Ⅲ 中,一个时间片就等于 SysTick 中断周期。没有用完的时间片不会再使用,下次任务得到执行还是按照一个时间片的时钟节拍运行。
首先,这里创建三个任务:Task1、Task2、Task3。Task1、Task2、Task3 的优先级均为 1,即 3 个任务同等优先级。然后,我们将三个任务的时间片都设置为 100。
该程序在运行时,首先 Task1 运行完 100 个时间片后,切换至 Task2 运行。然后,Task2 运行完 100 个时间片后,切换至 Task3 运行。如果在 Task3 运行过程中(还不到 100 个时间片),Task3 阻塞了(系统延时或等待信号量等),此时直接切换到下一个任务 Task1。接着,Task1 运行完 100 个时间片后,切换至 Task2 运行,依次循环运行下去。
注意没有用完的时间片不会再使用,下次任务 Task3 得到执行还是按照 100 个时间片的时钟节拍运行。
三、任务状态
µC/OS-Ⅲ 中任务共存在 5 种任务状态:运行态、就绪态、挂起态、休眠态 和 中断态。
- 运行态:正在执行的任务,该任务就处于运行态,注意在 STM32 中,同一时间仅一个任务处于运行态。
- 就绪态:如果该任务已经能够被执行,但当前还未被执行,那么该任务处于就绪态。
- 挂起态:如果一个运行态的任务因延迟或等待某一事件发生时被挂起,那么这个任务就处于挂起态。
- 休眠态:任务已经存在于 CPU 的内存中(任务被删除了),但是还没有交给 µC/OS-Ⅲ 内核管理。
- 中断态:当处于运行态的任务被中断打断,CPU 跳转去执行中中断服务函数时,原本属于运行态的任务会切换到中断态,直到中断结束,在切换运行态进行运行。
被创建的任务,初始状态均为就绪态。
被删除的任务,会转换为休眠态。
仅就绪态和中断态可以转变为运行态。
µC/OS-Ⅲ 主要有三大类任务列表用于跟踪任务状态:
这四种状态中,除了运行态,其他三种任务状态的任务都有其对应的任务状态列表。
- 就绪列表:准备运行的任务将放在就绪列表:OSRdyList[x],其中 x 代表任务优先级数值。
- Tick 列表:正在等待延迟超时或挂起的对象超时的任务,将放在 OSTickList。
- 挂起列表:当任务等待信号量、事件时,任务将放置在挂起列表 PendList。
调度器总是在所有处于就绪列表的任务中,选择具有最高优先级的任务来执行。
相同优先级的任务会连接在同一个就绪列表上。
四、µC/OS-Ⅲ的移植
4.1、µC/OS-Ⅲ源码的下载
我们可以从 GitHub 上下载 µC/OS-Ⅲ 的源码,uC-OS3:https://github.com/weston-embedded/uC-OS3,uC-CPU:https://github.com/weston-embedded/uC-CPU,uC-LIB:https://github.com/weston-embedded/uC-LIB。
【uC-OS3】的目录结构如下:
其中,主要的文件夹及其存放的文件说明如下:
目录文件 | 说明 |
---|---|
Cfg | 包含的是 µC/OS-Ⅲ 配置文件的模板文件 |
Ports | 包含的是与硬件相关的移植文件 |
Source | µC/OS-Ⅲ 的源码文件 |
Template | 仅包含了一个文件,这个文件是与动态 Tick 管理相关的文件 |
TLS | TLS 是 Thread Local Storage(线程本地存储)的缩写 |
Trace | 用来存放一些调试工具的,调试工具需要用户另外自行下载 |
LICENSE | µC/OS-Ⅲ 的许可文件 |
NOTICE | µC/OS-Ⅲ 的注意事项 |
README.rst | µC/OS-Ⅲ 的 README 文件 |
【uC-CPU】的目录结构如下:
该目录下是不同内核的 CPU 相关的移植文件,如前导置零指令、大小端模式设置等,这里,我们只需要关注有关 STM32F4 系列的内核文件,即【ARM-Cortex-M】文件夹下的文件。
【uC-LIB】的目录结构如下:
【uC-LIB】目录:官方提供的 ASCII 字符操作、数学、内存管理、字符串操作的库。
4.2、添加µC/OS-Ⅲ的源码
在基础工程的【Middleware】文件夹中新建一个【uC-OS3】子文件夹。接着就可以将 µC/OS-Ⅲ 及其相关组件的源代码添加到刚刚新建的【uC-OS3】子文件夹中了。接着就可以将 µC/OS-III 及其相关组件的源代码添加到刚刚新建的【uC-OS3】子文件夹中了。然后,我们裁剪掉不用的文件,裁剪后的文件结构如下:
4.3、修改SysTick相关的文件
µC/OS-Ⅲ 系统使用 SysTick 作为任务切换的时基单元,因此,我们需要修改有关 SysTick 的代码。
修改 stm32f4xx_it.c 文件中关于 SysTick 的中断服务函数:
#include "os.h"
/**
* @brief Systick中断服务函数
*
*/
void SysTick_Handler(void)
{
if (OSRunning == OS_STATE_OS_RUNNING) // 当UCOS系统运行了,才执行正常的调度处理
{
// 在硬件回调滴答定时器时,就直接调用µC/OS-Ⅲ中的时钟函数
// 1s内调用多少次,是由配置参数 OS_CFG_TICK_RATE_HZ 决定的
OS_CPU_SysTickHandler();
}
HAL_IncTick();
}
修改基础工程上的关于延迟初始化函数:
uint16_t g_frequency_us = 0; // us延时倍乘数
/**
* @brief 延迟初始化函数
*
* @param clock 系统时钟频率,单位为MHz
*/
void Delay_Init(uint16_t clock)
{
uint32_t reload = 0;
SysTick->CTRL = 0; // SysTick控制寄存器清零
HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK); // 设置SysTick时钟源为HCLK
g_frequency_us = clock; // 1us定时的计数频率
reload = clock; // 每秒钟的计数次数 单位为M
// 根据delay_ostickspersec设定溢出时间,reload为24位寄存器,最大值:16777216,在168M下,约合0.09986s左右
reload *= 1000000 / OSCfg_TickRate_Hz;
SysTick->CTRL |= 1 << 1; // 开启SysTick中断
SysTick->LOAD = reload; // 设置计数器的值
SysTick->CTRL |= 1 << 0; // 开启计数器
}
修改微秒级延迟函数:
/**
* @brief 微秒级延迟函数
*
* @param time 要延迟的微秒数
*/
void Delay_us(uint32_t time)
{
uint32_t tick = 0;
uint32_t t_old = 0, t_now = 0, t_count = 0;
uint32_t reload = SysTick->LOAD; // LOAD的值
OS_ERR err; // 定义用于接收错误代码的变量
tick = time * g_frequency_us; // 延迟时间加载
OSSchedLock(&err); // 锁定 uC/OS-III 的任务调度器
t_old = SysTick->VAL;
while (1)
{
t_now = SysTick->VAL; // tnow用于记录当前的SysTick->VAL 值
if (t_now < t_old) // 在一轮内,t_count加等于t_old到t_now的差值
{
t_count += t_old - t_now;
}
else // 超过一轮内,t_count加等于重装值减t_now到t_old的差值,即VAL-(t_now-t_old)
{
t_count += reload - t_now + t_old;
}
t_old = t_now; // t_old用于记录最近一次的SysTick->VAL值
if (t_count >= tick) // 时间超过或等于要延迟的时间,则定时时间到,退出
{
break;
}
}
OSSchedUnlock(&err); // 恢复 uC/OS-III 的任务调度器
}
修改毫秒级延迟函数:
/**
* @brief 毫秒级延迟函数
*
* @param time 要延迟的毫秒数
*/
void Delay_ms(uint32_t time)
{
for (uint32_t i = 0; i < time; i++)
{
Delay_us(1000);
}
}
4.4、修改有关任务切换的文件
STM32 的 HAL 库默认的任务切换的中断服务函数为 PendSV() 中断服务函数,而 µC/OS-Ⅲ 提供的任务切换的中断服务函数为 OS_CPU_PendSVHandler()。
HAL 库默认定义的任务切换在 stm32f4xx_it.c 文件中,它的内容如下:
我们需要将 STM32 的 startup_stm32f407xx.s 启动文件中的 PendSV_Handler
任务切换的中断服务函数名替换成 µC/OS-Ⅲ 默认的任务切换中断服务函数名 OS_CPU_PendSVHandler
。
4.5、配置µC/OS及其相关组件
µC/OS-Ⅲ 是可裁剪的,那么移植 µC/OS-Ⅲ 就需要涉及到对 µC/OS-Ⅲ 的配置,当然,同时 µC/CPU 和 µC/LIB 也是需要配置的。为了让 µC/OS-Ⅲ 在开发板上 “跑起来” 只需要修改 µC/CPU 的配置文件即可。µC/CPU 的配置文件的路径在 uC-CPU/Cfg/Template/cpu_cfg.h,打开该文件,并将配置文件中用于配置配置 CPU 中断优先级寄存器使用位数的宏开关置 1 即可。
#if 1
#define CPU_CFG_NVIC_PRIO_BITS 4u
#endif
对 µC/OS-Ⅲ 及其相关组件的配置,一共涉及到四个配置文件,这四个配置文件的文件名和对应的路径如下表所示:
cpu_cfg.h 配置文件主要用于配置 µC/OS-Ⅲ 内核的一些功能,比如:消息队列、信号量、事件标志等。修改后的内容如下:
/*
*********************************************************************************************************
* uC/CPU
* CPU CONFIGURATION & PORT LAYER
*
* Copyright 2004-2021 Silicon Laboratories Inc. www.silabs.com
*
* SPDX-License-Identifier: APACHE-2.0
*
* This software is subject to an open source license and is distributed by
* Silicon Laboratories Inc. pursuant to the terms of the Apache License,
* Version 2.0 available at www.apache.org/licenses/LICENSE-2.0.
*
*********************************************************************************************************
*/
/*
*********************************************************************************************************
*
* CPU CONFIGURATION FILE
*
* TEMPLATE
*
* Filename : cpu_cfg.h
* Version : V1.32.01
*********************************************************************************************************
*/
/*
*********************************************************************************************************
* MODULE
*********************************************************************************************************
*/
#ifndef CPU_CFG_MODULE_PRESENT
#define CPU_CFG_MODULE_PRESENT
/*
*********************************************************************************************************
* CPU NAME CONFIGURATION
*
* Note(s) : (1) Configure CPU_CFG_NAME_EN to enable/disable CPU host name feature :
*
* (a) CPU host name storage
* (b) CPU host name API functions
*
* (2) Configure CPU_CFG_NAME_SIZE with the desired ASCII string size of the CPU host name,
* including the terminating NULL character.
*
* See also 'cpu_core.h GLOBAL VARIABLES Note #1'.
*********************************************************************************************************
*/
/* Configure CPU host name feature (see Note #1) : */
#define CPU_CFG_NAME_EN DEF_ENABLED
/* DEF_DISABLED CPU host name DISABLED */
/* DEF_ENABLED CPU host name ENABLED */
/* Configure CPU host name ASCII string size ... */
#define CPU_CFG_NAME_SIZE 16 /* ... (see Note #2). */
/*
*********************************************************************************************************
* CPU TIMESTAMP CONFIGURATION
*
* Note(s) : (1) Configure CPU_CFG_TS_xx_EN to enable/disable CPU timestamp features :
*
* (a) CPU_CFG_TS_32_EN enable/disable 32-bit CPU timestamp feature
* (b) CPU_CFG_TS_64_EN enable/disable 64-bit CPU timestamp feature
*
* (2) (a) Configure CPU_CFG_TS_TMR_SIZE with the CPU timestamp timer's word size :
*
* CPU_WORD_SIZE_08 8-bit word size
* CPU_WORD_SIZE_16 16-bit word size
* CPU_WORD_SIZE_32 32-bit word size
* CPU_WORD_SIZE_64 64-bit word size
*
* (b) If the size of the CPU timestamp timer is not a binary multiple of 8-bit octets
* (e.g. 20-bits or even 24-bits), then the next lower, binary-multiple octet word
* size SHOULD be configured (e.g. to 16-bits). However, the minimum supported word
* size for CPU timestamp timers is 8-bits.
*
* See also 'cpu_core.h FUNCTION PROTOTYPES CPU_TS_TmrRd() Note #2a'.
*********************************************************************************************************
*/
/* Configure CPU timestamp features (see Note #1) : */
#define CPU_CFG_TS_32_EN DEF_ENABLED
#define CPU_CFG_TS_64_EN DEF_DISABLED
/* DEF_DISABLED CPU timestamps DISABLED */
/* DEF_ENABLED CPU timestamps ENABLED */
/* Configure CPU timestamp timer word size ... */
/* ... (see Note #2) : */
#define CPU_CFG_TS_TMR_SIZE CPU_WORD_SIZE_32
/*
*********************************************************************************************************
* CPU INTERRUPTS DISABLED TIME MEASUREMENT CONFIGURATION
*
* Note(s) : (1) (a) Configure CPU_CFG_INT_DIS_MEAS_EN to enable/disable measuring CPU's interrupts
* disabled time :
*
* (a) Enabled, if CPU_CFG_INT_DIS_MEAS_EN #define'd in 'cpu_cfg.h'
*
* (b) Disabled, if CPU_CFG_INT_DIS_MEAS_EN NOT #define'd in 'cpu_cfg.h'
*
* See also 'cpu_core.h FUNCTION PROTOTYPES Note #1'.
*
* (b) Configure CPU_CFG_INT_DIS_MEAS_OVRHD_NBR with the number of times to measure &
* average the interrupts disabled time measurements overhead.
*
* See also 'cpu_core.c CPU_IntDisMeasInit() Note #3a'.
*********************************************************************************************************
*/
#if 0 /* Configure CPU interrupts disabled time ... */
#define CPU_CFG_INT_DIS_MEAS_EN /* ... measurements feature (see Note #1a). */
#endif
/* Configure number of interrupts disabled overhead ... */
#define CPU_CFG_INT_DIS_MEAS_OVRHD_NBR 1u /* ... time measurements (see Note #1b). */
/*
*********************************************************************************************************
* CPU COUNT ZEROS CONFIGURATION
*
* Note(s) : (1) (a) Configure CPU_CFG_LEAD_ZEROS_ASM_PRESENT to define count leading zeros bits
* function(s) in :
*
* (1) 'cpu_a.asm', if CPU_CFG_LEAD_ZEROS_ASM_PRESENT #define'd in 'cpu.h'/
* 'cpu_cfg.h' to enable assembly-optimized function(s)
*
* (2) 'cpu_core.c', if CPU_CFG_LEAD_ZEROS_ASM_PRESENT NOT #define'd in 'cpu.h'/
* 'cpu_cfg.h' to enable C-source-optimized function(s) otherwise
*
* (b) Configure CPU_CFG_TRAIL_ZEROS_ASM_PRESENT to define count trailing zeros bits
* function(s) in :
*
* (1) 'cpu_a.asm', if CPU_CFG_TRAIL_ZEROS_ASM_PRESENT #define'd in 'cpu.h'/
* 'cpu_cfg.h' to enable assembly-optimized function(s)
*
* (2) 'cpu_core.c', if CPU_CFG_TRAIL_ZEROS_ASM_PRESENT NOT #define'd in 'cpu.h'/
* 'cpu_cfg.h' to enable C-source-optimized function(s) otherwise
*********************************************************************************************************
*/
#if 1 /* Configure CPU count leading zeros bits ... */
#define CPU_CFG_LEAD_ZEROS_ASM_PRESENT /* ... assembly-version (see Note #1a). */
#endif
#if 1 /* Configure CPU count trailing zeros bits ... */
#define CPU_CFG_TRAIL_ZEROS_ASM_PRESENT /* ... assembly-version (see Note #1b). */
#endif
/*
*********************************************************************************************************
* CPU ENDIAN TYPE OVERRIDE
*
* Note(s) : (1) Configure CPU_CFG_ENDIAN_TYPE to override the default CPU endian type defined in cpu.h.
*
* (a) CPU_ENDIAN_TYPE_BIG Big- endian word order (CPU words' most significant
* octet @ lowest memory address)
* (b) CPU_ENDIAN_TYPE_LITTLE Little-endian word order (CPU words' least significant
* octet @ lowest memory address)
*
* (2) Defining CPU_CFG_ENDIAN_TYPE here is only valid for supported bi-endian architectures.
* See 'cpu.h CPU WORD CONFIGURATION Note #3' for details
*********************************************************************************************************
*/
#if 1
#define CPU_CFG_ENDIAN_TYPE CPU_ENDIAN_TYPE_LITTLE /* Defines CPU data word-memory order (see Note #2). */
#endif
/*
*********************************************************************************************************
* CACHE MANAGEMENT
*
* Note(s) : (1) Configure CPU_CFG_CACHE_MGMT_EN to enable the cache management API.
*
* (2) This option only enables the cache management functions.
* It does not enable any hardware caches, which should be configured in startup code.
* Caches must be configured and enabled by the time CPU_Init() is called.
*
* (3) This option is usually required for device drivers which use a DMA engine to transmit
* buffers that are located in cached memory.
*********************************************************************************************************
*/
#define CPU_CFG_CACHE_MGMT_EN DEF_DISABLED /* Defines CPU data word-memory order (see Note #1). */
/*
*********************************************************************************************************
* KERNEL AWARE IPL BOUNDARY
*
* Note(s) : (1) Determines the IPL level that establishes the boundary for ISRs that are kernel-aware and
* those that are not. All ISRs at this level or lower are kernel-aware.
*
* (2) ARMv7-M: Since the port is using BASEPRI to separate kernel vs non-kernel aware ISR, please
* make sure your external interrupt priorities are set accordingly. For example, if
* CPU_CFG_KA_IPL_BOUNDARY is set to 4 then external interrupt priorities 4-15 will be kernel
* aware while priorities 0-3 will be use as non-kernel aware.
*********************************************************************************************************
*/
#define CPU_CFG_KA_IPL_BOUNDARY 4u
/*
*********************************************************************************************************
* ARM CORTEX-M
*
* Note(s) : (1) Determines the interrupt programmable priority levels. This is normally specified in the
* Microcontroller reference manual. 4-bits gives us 16 programmable priority levels.
*
* Example 1 Example 2
* NVIC_IPRx NVIC_IPRx
* 7 0 7 0
* +------------------+ +------------------+
* | PRIO | | PRIO |
* +------------------+ +------------------+
*
* Bits[7:4] Priority mask bits Bits[7:6] Priority mask bits
* Bits[3:0] Reserved Bits[5:0] Reserved
*
* Example 1: CPU_CFG_NVIC_PRIO_BITS should be set to 4 due to the processor
* implementing only bits[7:4].
*
* Example 2: CPU_CFG_NVIC_PRIO_BITS should be set to 2 due to the processor
* implementing only bits[7:6].
*********************************************************************************************************
*/
#if 1
#define CPU_CFG_NVIC_PRIO_BITS 4u
#endif
/*
*********************************************************************************************************
* MODULE END
*********************************************************************************************************
*/
#endif /* End of CPU cfg module include. */
lib_cfg.h 配置文件主要配置 µC/LIB 组件,如:使能内存库中优化的内存相关操作函数。修改后的内容如下:
/*
*********************************************************************************************************
* EXAMPLE CODE
*
* This file is provided as an example on how to use Micrium products.
*
* Please feel free to use any application code labeled as 'EXAMPLE CODE' in
* your application products. Example code may be used as is, in whole or in
* part, or may be used as a reference only. This file can be modified as
* required to meet the end-product requirements.
*
*********************************************************************************************************
*/
/*
*********************************************************************************************************
*
* CUSTOM LIBRARY CONFIGURATION FILE
*
* TEMPLATE
*
* Filename : lib_cfg.h
* Version : V1.39.01
*********************************************************************************************************
*/
/*
*********************************************************************************************************
* MODULE
*********************************************************************************************************
*/
#ifndef LIB_CFG_MODULE_PRESENT
#define LIB_CFG_MODULE_PRESENT
/*
*********************************************************************************************************
*********************************************************************************************************
* MEMORY LIBRARY CONFIGURATION
*********************************************************************************************************
*********************************************************************************************************
*/
/*
*********************************************************************************************************
* MEMORY LIBRARY ARGUMENT CHECK CONFIGURATION
*
* Note(s) : (1) Configure LIB_MEM_CFG_ARG_CHK_EXT_EN to enable/disable the memory library suite external
* argument check feature :
*
* (a) When ENABLED, arguments received from any port interface provided by the developer
* or application are checked/validated.
*
* (b) When DISABLED, NO arguments received from any port interface provided by the developer
* or application are checked/validated.
*********************************************************************************************************
*/
/* External argument check. */
/* Indicates if arguments received from any port ... */
/* ... interface provided by the developer or ... */
/* ... application are checked/validated. */
#define LIB_MEM_CFG_ARG_CHK_EXT_EN DEF_DISABLED
/*
*********************************************************************************************************
* MEMORY LIBRARY ASSEMBLY OPTIMIZATION CONFIGURATION
*
* Note(s) : (1) Configure LIB_MEM_CFG_OPTIMIZE_ASM_EN to enable/disable assembly-optimized memory function(s).
*********************************************************************************************************
*/
/* Assembly-optimized function(s). */
/* Enable/disable assembly-optimized memory ... */
/* ... function(s). [see Note #1] */
#define LIB_MEM_CFG_OPTIMIZE_ASM_EN DEF_DISABLED
/*
*********************************************************************************************************
* MEMORY ALLOCATION CONFIGURATION
*
* Note(s) : (1) Configure LIB_MEM_CFG_DBG_INFO_EN to enable/disable memory allocation usage tracking
* that associates a name with each segment or dynamic pool allocated.
*
* (2) (a) Configure LIB_MEM_CFG_HEAP_SIZE with the desired size of heap memory (in octets).
*
* (b) Configure LIB_MEM_CFG_HEAP_BASE_ADDR to specify a base address for heap memory :
*
* (1) Heap initialized to specified application memory, if LIB_MEM_CFG_HEAP_BASE_ADDR
* #define'd in 'lib_cfg.h';
* CANNOT #define to address 0x0
*
* (2) Heap declared to Mem_Heap[] in 'lib_mem.c', if LIB_MEM_CFG_HEAP_BASE_ADDR
* NOT #define'd in 'lib_cfg.h'
*********************************************************************************************************
*/
/* Allocation debugging information. */
/* Enable/disable allocation of debug information ... */
/* ... associated to each memory allocation. */
#define LIB_MEM_CFG_DBG_INFO_EN DEF_DISABLED
/* Heap memory size (in bytes). */
/* Configure the desired size of the heap memory. ... */
/* ... Set to 0 to disable heap allocation features. */
#define LIB_MEM_CFG_HEAP_SIZE 0u
/* Heap memory padding alignment (in bytes). */
/* Configure the desired size of padding alignment ... */
/* ... of each buffer allocated from the heap. */
#define LIB_MEM_CFG_HEAP_PADDING_ALIGN LIB_MEM_PADDING_ALIGN_NONE
#if 0 /* Remove this to have heap alloc at specified addr. */
#define LIB_MEM_CFG_HEAP_BASE_ADDR 0x00000000 /* Configure heap memory base address (see Note #2b). */
#endif
/*
*********************************************************************************************************
*********************************************************************************************************
* STRING LIBRARY CONFIGURATION
*********************************************************************************************************
*********************************************************************************************************
*/
/*
*********************************************************************************************************
* STRING FLOATING POINT CONFIGURATION
*
* Note(s) : (1) Configure LIB_STR_CFG_FP_EN to enable/disable floating point string function(s).
*
* (2) Configure LIB_STR_CFG_FP_MAX_NBR_DIG_SIG to configure the maximum number of significant
* digits to calculate &/or display for floating point string function(s).
*
* See also 'lib_str.h STRING FLOATING POINT DEFINES Note #1'.
*********************************************************************************************************
*/
/* Floating point feature(s). */
/* Enable/disable floating point to string functions. */
#define LIB_STR_CFG_FP_EN DEF_DISABLED
/* Floating point number of significant digits. */
/* Configure the maximum number of significant ... */
/* ... digits to calculate &/or display for ... */
/* ... floating point string function(s). */
#define LIB_STR_CFG_FP_MAX_NBR_DIG_SIG LIB_STR_FP_MAX_NBR_DIG_SIG_DFLT
/*
*********************************************************************************************************
* MODULE END
*********************************************************************************************************
*/
#endif /* End of lib cfg module include. */
os_cfg.h 配置文件主要配置 CPU 相关的一些宏定义,如:时间戳、前导置零指令相关等内容。修改后的内容如下:
/*
*********************************************************************************************************
* uC/OS-III
* The Real-Time Kernel
*
* Copyright 2009-2021 Silicon Laboratories Inc. www.silabs.com
*
* SPDX-License-Identifier: APACHE-2.0
*
* This software is subject to an open source license and is distributed by
* Silicon Laboratories Inc. pursuant to the terms of the Apache License,
* Version 2.0 available at www.apache.org/licenses/LICENSE-2.0.
*
*********************************************************************************************************
*/
/*
*********************************************************************************************************
*
* CONFIGURATION FILE
*
* Filename : os_cfg.h
* Version : V3.08.01
*********************************************************************************************************
*/
#ifndef OS_CFG_H
#define OS_CFG_H
/* --------------------------- MISCELLANEOUS --------------------------- */
#define OS_CFG_APP_HOOKS_EN 0u /* Enable (1) or Disable (0) application specific hooks */
#define OS_CFG_ARG_CHK_EN 1u /* Enable (1) or Disable (0) argument checking */
#define OS_CFG_CALLED_FROM_ISR_CHK_EN 1u /* Enable (1) or Disable (0) check for called from ISR */
#define OS_CFG_DBG_EN 1u /* Enable (1) or Disable (0) debug code/variables */
#define OS_CFG_TICK_EN 1u /* Enable (1) or Disable (0) the kernel tick */
#define OS_CFG_DYN_TICK_EN 0u /* Enable (1) or Disable (0) the Dynamic Tick */
#define OS_CFG_INVALID_OS_CALLS_CHK_EN 1u /* Enable (1) or Disable (0) checks for invalid kernel calls */
#define OS_CFG_OBJ_TYPE_CHK_EN 1u /* Enable (1) or Disable (0) object type checking */
#define OS_CFG_OBJ_CREATED_CHK_EN 1u /* Enable (1) or Disable (0) object created checks */
#define OS_CFG_TS_EN 1u /* Enable (1) or Disable (0) time stamping */
#define OS_CFG_PRIO_MAX 32u /* Defines the maximum number of task priorities (see OS_PRIO data type) */
#define OS_CFG_SCHED_LOCK_TIME_MEAS_EN 0u /* Include code to measure scheduler lock time */
#define OS_CFG_SCHED_ROUND_ROBIN_EN 1u /* Include code for Round-Robin scheduling */
#define OS_CFG_STK_SIZE_MIN 64u /* Minimum allowable task stack size */
/* --------------------------- EVENT FLAGS ----------------------------- */
#define OS_CFG_FLAG_EN 1u /* Enable (1) or Disable (0) code generation for EVENT FLAGS */
#define OS_CFG_FLAG_DEL_EN 1u /* Include code for OSFlagDel() */
#define OS_CFG_FLAG_MODE_CLR_EN 1u /* Include code for Wait on Clear EVENT FLAGS */
#define OS_CFG_FLAG_PEND_ABORT_EN 1u /* Include code for OSFlagPendAbort() */
/* ------------------------ MEMORY MANAGEMENT ------------------------- */
#define OS_CFG_MEM_EN 1u /* Enable (1) or Disable (0) code generation for the MEMORY MANAGER */
/* ------------------- MUTUAL EXCLUSION SEMAPHORES -------------------- */
#define OS_CFG_MUTEX_EN 1u /* Enable (1) or Disable (0) code generation for MUTEX */
#define OS_CFG_MUTEX_DEL_EN 1u /* Include code for OSMutexDel() */
#define OS_CFG_MUTEX_PEND_ABORT_EN 1u /* Include code for OSMutexPendAbort() */
/* -------------------------- MESSAGE QUEUES -------------------------- */
#define OS_CFG_Q_EN 1u /* Enable (1) or Disable (0) code generation for QUEUES */
#define OS_CFG_Q_DEL_EN 1u /* Include code for OSQDel() */
#define OS_CFG_Q_FLUSH_EN 1u /* Include code for OSQFlush() */
#define OS_CFG_Q_PEND_ABORT_EN 1u /* Include code for OSQPendAbort() */
/* ---------------------------- SEMAPHORES ----------------------------- */
#define OS_CFG_SEM_EN 1u /* Enable (1) or Disable (0) code generation for SEMAPHORES */
#define OS_CFG_SEM_DEL_EN 1u /* Include code for OSSemDel() */
#define OS_CFG_SEM_PEND_ABORT_EN 1u /* Include code for OSSemPendAbort() */
#define OS_CFG_SEM_SET_EN 1u /* Include code for OSSemSet() */
/* -------------------------- TASK MANAGEMENT -------------------------- */
#define OS_CFG_STAT_TASK_EN 1u /* Enable (1) or Disable (0) the statistics task */
#define OS_CFG_STAT_TASK_STK_CHK_EN 1u /* Check task stacks from the statistic task */
#define OS_CFG_TASK_CHANGE_PRIO_EN 1u /* Include code for OSTaskChangePrio() */
#define OS_CFG_TASK_DEL_EN 1u /* Include code for OSTaskDel() */
#define OS_CFG_TASK_IDLE_EN 1u /* Include the idle task */
#define OS_CFG_TASK_PROFILE_EN 1u /* Include variables in OS_TCB for profiling */
#define OS_CFG_TASK_Q_EN 1u /* Include code for OSTaskQXXXX() */
#define OS_CFG_TASK_Q_PEND_ABORT_EN 1u /* Include code for OSTaskQPendAbort() */
#define OS_CFG_TASK_REG_TBL_SIZE 0u /* Number of task specific registers */
#define OS_CFG_TASK_STK_REDZONE_EN 1u /* Enable (1) or Disable (0) stack redzone */
#define OS_CFG_TASK_STK_REDZONE_DEPTH 8u /* Depth of the stack redzone */
#define OS_CFG_TASK_SEM_PEND_ABORT_EN 1u /* Include code for OSTaskSemPendAbort() */
#define OS_CFG_TASK_SUSPEND_EN 1u /* Include code for OSTaskSuspend() and OSTaskResume() */
/* ------------------ TASK LOCAL STORAGE MANAGEMENT ------------------- */
#define OS_CFG_TLS_TBL_SIZE 0u /* Include code for Task Local Storage (TLS) registers */
/* ------------------------- TIME MANAGEMENT -------------------------- */
#define OS_CFG_TIME_DLY_HMSM_EN 1u /* Include code for OSTimeDlyHMSM() */
#define OS_CFG_TIME_DLY_RESUME_EN 1u /* Include code for OSTimeDlyResume() */
/* ------------------------- TIMER MANAGEMENT -------------------------- */
#define OS_CFG_TMR_EN 1u /* Enable (1) or Disable (0) code generation for TIMERS */
#define OS_CFG_TMR_DEL_EN 1u /* Enable (1) or Disable (0) code generation for OSTmrDel() */
/* ------------------------- TRACE RECORDER ---------------------------- */
#define OS_CFG_TRACE_EN 0u /* Enable (1) or Disable (0) uC/OS-III Trace instrumentation */
#define OS_CFG_TRACE_API_ENTER_EN 0u /* Enable (1) or Disable (0) uC/OS-III Trace API enter instrumentation */
#define OS_CFG_TRACE_API_EXIT_EN 0u /* Enable (1) or Disable (0) uC/OS-III Trace API exit instrumentation */
#endif
os_cfg_app.h 配置文件用于配置系统的应用配置,如空闲任务、任务统计任务、软件定时器任务的参数配置等。修改后的内容如下:
/*
*********************************************************************************************************
* uC/OS-III
* The Real-Time Kernel
*
* Copyright 2009-2021 Silicon Laboratories Inc. www.silabs.com
*
* SPDX-License-Identifier: APACHE-2.0
*
* This software is subject to an open source license and is distributed by
* Silicon Laboratories Inc. pursuant to the terms of the Apache License,
* Version 2.0 available at www.apache.org/licenses/LICENSE-2.0.
*
*********************************************************************************************************
*/
/*
*********************************************************************************************************
*
* OS CONFIGURATION (APPLICATION SPECIFICS)
*
* Filename : os_cfg_app.h
* Version : V3.08.01
*********************************************************************************************************
*/
#ifndef OS_CFG_APP_H
#define OS_CFG_APP_H
/*
**************************************************************************************************************************
* CONSTANTS
**************************************************************************************************************************
*/
/* ------------------ MISCELLANEOUS ------------------- */
/* Stack size of ISR stack (number of CPU_STK elements) */
#define OS_CFG_ISR_STK_SIZE 128u
/* Maximum number of messages */
#define OS_CFG_MSG_POOL_SIZE 32u
/* Stack limit position in percentage to empty */
#define OS_CFG_TASK_STK_LIMIT_PCT_EMPTY 10u
/* -------------------- IDLE TASK --------------------- */
/* Stack size (number of CPU_STK elements) */
#define OS_CFG_IDLE_TASK_STK_SIZE 64u
/* ------------------ STATISTIC TASK ------------------ */
/* Priority */
#define OS_CFG_STAT_TASK_PRIO ((OS_PRIO)(OS_CFG_PRIO_MAX-2u))
/* Rate of execution (1 to 10 Hz) */
#define OS_CFG_STAT_TASK_RATE_HZ 10u
/* Stack size (number of CPU_STK elements) */
#define OS_CFG_STAT_TASK_STK_SIZE 100u
/* ---------------------- TICKS ----------------------- */
/* Tick rate in Hertz (10 to 1000 Hz) */
#define OS_CFG_TICK_RATE_HZ 1000u
/* --------------------- TIMERS ----------------------- */
/* Priority of 'Timer Task' */
#define OS_CFG_TMR_TASK_PRIO ((OS_PRIO)(OS_CFG_PRIO_MAX-3u))
/* Stack size (number of CPU_STK elements) */
#define OS_CFG_TMR_TASK_STK_SIZE 128u
/* DEPRECATED - Rate for timers (10 Hz Typ.) */
/* The timer task now calculates its timeouts based */
/* on the timers in the list. It no longer runs at a */
/* static frequency. */
/* This define is included for compatibility reasons. */
/* It will determine the period of a timer tick. */
/* We recommend setting it to OS_CFG_TICK_RATE_HZ */
/* for new projects. */
#define OS_CFG_TMR_TASK_RATE_HZ 10u
#endif