Files
cosyos/Port/syscfg.h
零中断延迟的RTOS d9232ff117 update Port/syscfg.h.
Signed-off-by: 零中断延迟的RTOS <cosyos@139.com>
2026-02-02 07:59:12 +00:00

486 lines
22 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**************************************************************************//**
* @item CosyOS-III Config
* @file syscfg.h
* @brief OS Config File
* @author 迟凯峰
* @version V2.3.0
* @date 2026.02.02
******************************************************************************/
#ifndef __SYSCFG_H
#define __SYSCFG_H
///////////////////////////////////////////////////////////////////////////////
//*** <<< Use Configuration Wizard in Context Menu >>> ***//
///////////////////////////////////////////////////////////////////////////////
// <h> 系统配置
// <i> 系统配置
// <o> MCU内核
// <1=> 8051 <2=> 80251 <3=> Cortex-M
// <i> 告知CosyOS您的MCU内核CosyOS将自动包含相匹配的MCU配置文件和PORT文件。
#define __SYSCFG_MCUCORE 3
// <s> 标准头文件
// <i> 定义与您的MCU相匹配的标准头文件您的c文件中不必再包含此文件。
// <i> 注意:在文本编辑界面中定义时,外层应添加双引号,如:"stm32f4xx.h"。
// <i> 如果使用STM32CubeMX生成代码并生成main函数此处定义为"main.h"即可。
#define SYSCFG_STANDARDHEAD ""
// <o> 系统滴答周期us
// <i> 告知CosyOS系统滴答定时器的溢出时间单位为微秒。
// <i> 是CosyOS软件定时器延时、超时、定时等操作的基本时间。
// <i> 可开启系统滴答时间统计功能,您的设定值应远大于统计值。
#define SYSCFG_SYSTICK_CYCLE 1000
// <q> 内核锁嵌套
// <i> 内核锁是否支持嵌套调用?
// <i> 通常您可能不会用到内核锁,即使偶尔使用也应是极简的代码、一般不会嵌套调用。
#define SYSCFG_KERNELLOCKNESTING 0
// <q> 安全运行时
// <i> 是否启用安全运行时?
// <i> 安全运行时是CosyOS的安全关键技术之一可防止某任务长期独占或超时使用处理器。
#define SYSCFG_SAFERUNTIME 0
// <q> 低功耗模式
// <i> 是否启用低功耗模式?
// <i> 如果开启该选项CosyOS会在系统空闲任务中进入低功耗模式。
// <i> 低功耗模式通常为空闲模式、睡眠模式,可被中断唤醒,但未必所有中断都能唤醒。
// <i> 您也可不启用该功能,并自行配置自己的低功耗,在 idle_hook 中。
#define SYSCFG_LOWPOWERMODE 0
// <q> 中断挂起服务_FIFO-错误调用返回
// <i> 是否启用中断挂起服务_FIFO-错误调用返回?
// <i> 启用该功能后当中断挂起服务_FIFO执行失败时可在相应的回调函数中处理善后。
#define SYSCFG_PENDSVFIFO_ERRORCALLBACK 0
// </h>
///////////////////////////////////////////////////////////////////////////////
// <e> DEBUG配置
// <i> 是否启用DEBUG
// <i> DEBUG包括命令行与任务管理器启用DEBUG后CosyOS会自动创建两个系统任务
// <i> 来实现相关功能,它们分别是:
// <i> 系统调试器Debugger [maxpri]
// <i> 任务管理器Taskmgr [maxpri-1]
#define SYSCFG_DEBUGGING 0
#if (SYSCFG_DEBUGGING == 1)
// <o> 任务名称最大长度
// <i> 取值范围:<10-255>
// <i> 任务名称应尽量简短不可过长因为它会对总的flash和内存占用有着一定影响。
#define SYSCFG_TASKNAMELEN_MAX 10
// <o> 在线用户任务总数
// <i> 当相同优先级任务调度算法未选择无调度时,应定义此项。
// <i> 仅指启动并加入到任务队列的用户任务总数,不包括未启动的任务和系统任务。
// <i> 此项参数应大于等于实际的数量,但不可小于。
#define SYSCFG_USERTASKTOTAL 16
// <h> 任务管理器监控选项
// <i> 任务管理器监控选项
// <q> PSV-FIFO监控
// <i> 是否开启PendSV_FIFO监控
// <i> 开启后系统将自动监控PendSV_FIFO的实际最大占用深度并通过任务管理器输出输出格式为历史最大值/设置值。
// <i> 建议在调试阶段开启此项功能,正式的产品可禁用以提高性能。
#define SYSCFG_PENDSVFIFO_MONITOR 1
// <q> 任务pc值监控
// <i> 是否启用任务pc值监控
// <i> 当任务管理器被调度运行时被切换的任务入栈的PC值。
// <i> 当有任务出现代码运行卡死或死循环时此功能可用来帮助用户锁定具体位置以便查找BUG。注意pc值为下一条汇编指令的地址。
// <i> 建议在调试阶段开启此项功能,正式的产品可禁用以提高性能。
// <i> 某任务出现代码运行卡死或死循环的表现任务始终为就绪状态且占用较高的CPU使用率比它优先级低的任务一直都没有机会运行。
#define SYSCFG_TASKPC_MONITOR 1
// <q> 运行时间统计
// <i> 是否启用运行时间统计?
#define SYSCFG_RUNTIME_COUNT 1
// <q> 滴答时间统计
// <i> 是否启用系统滴答时间统计?
// <i> 统计系统滴答定时器中断,在每个系统滴答周期运行时间的平均值。
// <i> 建议在调试阶段开启此项功能,正式的产品可禁用以提高性能。
#define SYSCFG_SYSTICKTIME_COUNT 1
// <q> 当前时间显示
// <i> 是否显示当前时间?
// <i> 如果有硬件RTC或启用了软件RTC可考虑开启该功能。
// <i> 如果启用了软件RTC任务管理器会通过软件RTC来获取当前时间
// <i> 如果未启用软件RTC已经有硬件RTC任务管理器会通过RTC钩子来获取当前时间此时您应完善 rtc_hook 中的代码。
#define SYSCFG_RTC_SHOW 0
// </h>
#endif
// <q> 开机自动启动任务管理器
// <i> 设备开机后,是否自动启动任务管理器?
#define SYSCFG_TASKMGR_AUTOSTART 0
// <o> 任务管理器默认更新速度
// <500=> 快速500毫秒<1000=> 中速1秒<2000=> 慢速2秒
// <i> 任务管理器默认更新速度
#define SYSCFG_TASKMGR_UPSPEED 1000
// <q> DEBUG钩子是否传参数据包长度给用户
// <i> DEBUG发送的数据均为字符串且带有字符串尾'\0',如果用户需要获取数据包长度,可开启该选项。
#define SYSCFG_DEBUG_SENDLEN 1
// </e>
///////////////////////////////////////////////////////////////////////////////
// <h> 系统任务配置
// <i> 系统任务配置
// <o> Debugger-StackSize
// <i> 系统调试器的任务栈大小单位为字节数Bytes
#define SYSCFG_STACKSIZE_DEBUGGER 384
// <o> Taskmgr-StackSize
// <i> 任务管理器的任务栈大小单位为字节数Bytes
#define SYSCFG_STACKSIZE_TASKMGR 384
// <o> Starter-StackSize
// <i> 任务启动器的任务栈大小单位为字节数Bytes
#define SYSCFG_STACKSIZE_STARTER 384
// <o> Sysidle-StackSize
// <i> 系统空闲任务的任务栈大小单位为字节数Bytes
#define SYSCFG_STACKSIZE_SYSIDLE 256
// <o> 任务栈重分配增量
// <i> 当任务栈模式为MSP模式、任务为动态创建时CosyOS将自动启用任务栈重分配机制以抵御任务栈溢出的风险。
// <i> 通过合理的配置一个重分配增量,可有效降低重分配的次数,减少内存碎片。
// <i> 此值的设置适当就好,不建议过大或过小。
#define SYSCFG_TASKSTACK_REALLOCINC 16
// <o> Starter-创建模式
// <0=> 静态创建 <1=> 动态创建
// <i> 一般情况下推荐采用动态创建Starter删除自身后内存可被回收
// <i> 但用户千万不要忘记配置足够大的内存池或HEAP。
#define __SYSCFG_STARTERCREATE 0
// </h>
///////////////////////////////////////////////////////////////////////////////
// <h> 全局任务配置
// <i> 全局任务配置
// <o> 任务PICK位图
// <1=> 128字节 <2=> 256字节
// <i> 128字节PICK位图占用128字节常量内存
// <i> 256字节PICK位图占用256字节常量内存
// <i> 256字节PICK位图的任务调度性能优于128字节PICK位图。
#define SYSCFG_TASKPICKBITMAP 1
// <o> 任务优先级总数
// <i> CosyOS的任务优先级数值越大优先级越高数值越小优先级越低最低优先级固定为0级。
// <i> 如任务优先级总数为8则最高优先级为7级最低优先级为0级。
// <i> 如果未启用DEBUG接口系统会占用两级优先级包括最高一级和最低一级
// <i> 如果启用了DEBUG接口系统会占用四级优先级包括最高三级和最低一级
// <i> 设置任务优先级总数应有分组意识如8级不够用应尽量控制在64级内如64级不够用最大可为256
// <i> 原因是:
// <i> <=8任务就绪表为零级位图占用内存最少、调度性能最佳
// <i> <=64任务就绪表为一级位图占用内存适中、调度性能适中
// <i> <=256任务就绪表为二级位图占用内存最多、调度性能最低。
#define SYSCFG_TASKPRIORITY 16
// <o> 相同优先级任务调度算法
// <0=> 无调度 <1=> 协作式调度 <2=> 时间片轮转调度
// <i> 对于 CosyOS 来说,不同优先级的任务,永远都实行抢占式调度;
// <i> 而相同优先级的任务,则分为无调度、协作式调度、时间片轮转调度。
// <i> 无调度,是指不支持相同优先级的任务调度,每个任务的优先级都必须不同。
// <i> 协作式调度,要求任务必须主动放弃处理器使用权(阻塞或挂起等方式),才能切换至下一个相同优先级的任务运行。
// <i> 协作式调度,在性能上会高于时间片轮转调度,而且更节约内存。
// <i> 协作式调度,用户不能创建自己的空闲任务。
// <i> 在未经深思熟虑时,可优先选择时间片轮转调度,以保证相同优先级任务的平等运行机会。
#define SYSCFG_SAMEPRISCHEDULE 2
// <h> 时间片模式
// <i> 当相同优先级任务调度算法选择为时间片轮转调度时,应定义此项。
// <i> CosyOS有三种时间片的定义模式全局时间片、算法时间片、自定义时间片您只能选其一。
// <i> 全局时间片,所有任务采用相同的时间片。
// <i> 算法时间片,不同优先级的任务,时间片不同,采用一个算法公式来描述。
// <i> 自定义时间片,不同优先级的任务,时间片不同,用户自定义各优先级的时间片。
// <i> 全局时间片,简单高效,时间片轮转调度性能为最佳;算法时间片、自定义时间片,可实现不同优先级的、精细的时间片控制。
// <i> 时间片的取值范围:<1-65535>,单位为滴答周期。
// <e> 全局时间片
// <i> 是否启用全局时间片?
#define __SYSCFG_GLOBALTIMESHARING 1
// <o> 时间片时间
// <i> 时间片时间
#define SYSCFG_GLOBALTIMESHARING 100
// </e>
// <e> 算法时间片
// <i> 是否启用算法时间片?
#define __SYSCFG_FORMULATIMESHARING 0
// <o> 时间片算法公式
// <i> 时间片 = f(pri)pri为任务优先级。
// <i> 应在文本编辑界面中定义,默认定义为示例。
#define SYSCFG_FORMULATIMESHARING(pri) ((SYSCFG_TASKPRIORITY - pri) * 5)
// </e>
// <e> 自定义时间片
// <i> 是否启用自定义时间片?
#define __SYSCFG_CUSTOMTIMESHARING 0
// <o> 时间片数组
// <i> 从优先级0级开始逐个写出各优先级的时间片并用逗号间隔。
// <i> 应在文本编辑界面中定义默认定义为示例任务优先级总数为16。
#define SYSCFG_CUSTOMTIMESHARING 100,90,80,70,60,50,40,30,20,10,7,5,4,3,2,1
// <o> 时间片最大值
// <i> 时间片最大值
#define SYSCFG_TIMESHARING_MAX 255
// </e>
// </h>
// <o> 任务定时器时间轮槽数
// <1=> 2个 <2=> 4个 <3=> 8个 <4=> 16个 <5=> 32个 <6=> 64个 <7=> 128个 <8=> 256个
// <251=> 自动配置(性能)<253=> 自动配置(平衡)<256=> 自动配置(节约内存)
// <i> 时间轮槽数越多,定时器的计数效率就会越高、但这同时也意味着更多的内存资源占用。
// <i> 时间轮槽数过多也是没有必要的,最多选择与任务总数较为接近的数值即可。
// <i> 时间轮槽数只能从选项中选取,用户不可擅自定义其它数值。
#define SYSCFG_TIMESLOTBITS 253
// <o> 任务定时器位数
// <8=> 8位 <16=> 16位 <32=> 32位
// <i> 如果MCU内核为8051此项建议尽量配置为低位8位/16位这将使大部分任务服务的执行效率提升约10%。
#define SYSCFG_DELAYBITS 32
// </h>
///////////////////////////////////////////////////////////////////////////////
// <h> 定时中断/查询设置
// <i> 定时中断/查询设置
// <o> 用户定时中断总数
// <i> 取值范围:<0-32>
// <i> 用户创建的定时中断任务/钩子总数。
// <i> 此项参数应等于实际的数量,既不能大于也不能小于。
// <i> 如果定义数量大于实际数量,会引起编译器警告,否则不会有任何提示。
#define SYSCFG_USERTIMINTTOTAL 0
// <o> 用户定时查询总数
// <i> 取值范围:<0-32>
// <i> 用户创建的定时查询任务/钩子总数。
// <i> 此项参数应等于实际的数量,既不能大于也不能小于。
// <i> 如果定义数量大于实际数量,会引起编译器警告,否则不会有任何提示。
#define SYSCFG_USERTIMQRYTOTAL 0
// <o> 用户定时查询初始化状态
// <0=> 停止状态 <1=> 查询状态
// <i> 停止状态:用户的定时查询,在初始化后为停止状态,不能计数也不能查询用户定义的事件。
// <i> 查询状态:用户的定时查询,在初始化后为查询状态,系统已经开始查询用户定义的事件了。
#define SYSCFG_USERTIMQRYINIT 1
// <o> 定时中断定时器位数
// <8=> 8位 <16=> 16位 <32=> 32位
// <i> 如果MCU内核为8051此项建议尽量配置为低位以提高性能。
#define SYSCFG_TIMINTBITS 32
// <o> 定时查询定时器位数
// <8=> 8位 <16=> 16位 <32=> 32位
// <i> 如果MCU内核为8051此项建议尽量配置为低位以提高性能。
#define SYSCFG_TIMQRYBITS 32
// </h>
///////////////////////////////////////////////////////////////////////////////
// <h> 钩子函数设置
// <i> 钩子函数设置
// <q> 空闲钩子
// <i> 是否启用空闲钩子?
#define SYSCFG_IDLEHOOK 0
// <q> 滴答钩子
// <i> 是否启用滴答钩子?
#define SYSCFG_TICKHOOK 0
// <q> 挂起服务钩子
// <i> 是否启用挂起服务钩子?
#define SYSCFG_PENDSVHOOK 0
// </h>
///////////////////////////////////////////////////////////////////////////////
// <h> 线程通信设置
// <i> 线程通信设置
// <e> 互斥信号量
// <i> 是否启用互斥信号量?
#define SYSCFG_MUTEX 1
// <o> 天花板基本优先级
// <i> 当相同优先级任务调度算法选择无调度时,应定义此项。
// <i> 此时,互斥信号量将采用优先级天花板机制,来抑制优先级反转的发生。
// <i> CosyOS的优先级天花板有别于传统RTOS该天花板为一个连续的任务优先级
// <i> 天花板优先级的数量,取决于您在任务中嵌套获取不同互斥量的最大深度。
// <i> 所有天花板优先级都应做为保留,所有任务都不应该主动占用它们。
// <i> 您应在此定义天花板优先级的最低级。
// <i> 示例:
// <i> 任务优先级数 = 64其中[63~61]被系统占用,[60~56]被您的高优先级任务占用(这些任务都不可以再使用互斥量);
// <i> 您在任务中嵌套获取不同互斥量的最大深度 = 3
// <i> =>
// <i> 天花板基本优先级 = 56-3 = 53[53~55]为天花板优先级,您不可擅自使用它们。
#define SYSCFG_BASEPRI_CEILING 53
// </e>
// <q> 二值信号量
// <i> 是否启用二值信号量?
#define SYSCFG_BINARY 1
// <e> 计数信号量
// <i> 是否启用计数信号量?
#define SYSCFG_SEMAPHORE 1
// <o> 计数信号量位数
// <8=> 8位 <16=> 16位 <32=> 32位
// <i> 如果MCU内核为8051此项建议尽量配置为低位以提高性能。
#define SYSCFG_SEMAPHOREBITS 32
// </e>
// <q> 事件标志组
// <i> 是否启用事件标志组?
#define SYSCFG_FLAGGROUP 1
// <q> 私信
// <i> 是否启用私信?
#define SYSCFG_TASKMSG 1
// <q> 飞信
// <i> 是否启用飞信?
#define SYSCFG_FETION 1
// <q> 消息邮箱
// <i> 是否启用消息邮箱?
#define SYSCFG_MAILBOX 1
// <q> 消息队列
// <i> 是否启用消息队列?
#define SYSCFG_MSGQUEUE 1
// </h>
///////////////////////////////////////////////////////////////////////////////
// <h> 杂项设置
// <i> 杂项设置
// <q> 用户动态内存分配
// <i> 在任务中是否使用动态内存分配?包括进程内存分配和线程内存分配的相关服务调用。
#define SYSCFG_DYNMEMMGE 0
// <e> 软件RTC
// <i> 是否启用软件RTC
#define SYSCFG_SOFTRTC 0
// <h> 生产日期
// <o> 年
// <2025=> 2025 <2026=> 2026 <2027=> 2027 <2028=> 2028 <2029=> 2029
// <2030=> 2030 <2031=> 2031 <2032=> 2032 <2033=> 2033 <2034=> 2034 <2035=> 2035 <2036=> 2036 <2037=> 2037 <2038=> 2038 <2039=> 2039
// <2040=> 2040 <2041=> 2041 <2042=> 2042 <2043=> 2043 <2044=> 2044 <2045=> 2045 <2046=> 2046 <2047=> 2047 <2048=> 2048 <2049=> 2049
// <2050=> 2050 <2051=> 2051 <2052=> 2052 <2053=> 2053 <2054=> 2054 <2055=> 2055 <2056=> 2056 <2057=> 2057 <2058=> 2058 <2059=> 2059
// <2060=> 2060 <2061=> 2061 <2062=> 2062 <2063=> 2063 <2064=> 2064 <2065=> 2065 <2066=> 2066 <2067=> 2067 <2068=> 2068 <2069=> 2069
// <2070=> 2070 <2071=> 2071 <2072=> 2072 <2073=> 2073 <2074=> 2074 <2075=> 2075 <2076=> 2076 <2077=> 2077 <2078=> 2078 <2079=> 2079
// <2080=> 2080 <2081=> 2081 <2082=> 2082 <2083=> 2083 <2084=> 2084 <2085=> 2085 <2086=> 2086 <2087=> 2087 <2088=> 2088 <2089=> 2089
// <2090=> 2090 <2091=> 2091 <2092=> 2092 <2093=> 2093 <2094=> 2094 <2095=> 2095 <2096=> 2096 <2097=> 2097 <2098=> 2098 <2099=> 2099
#define __SYSCFG_YEAR 2026
// <o> 月
// <1=> 1 <2=> 2 <3=> 3 <4=> 4 <5=> 5 <6=> 6 <7=> 7 <8=> 8 <9=> 9 <10=> 10 <11=> 11 <12=> 12
#define __SYSCFG_MONTH 1
// <o> 日
// <1=> 1 <2=> 2 <3=> 3 <4=> 4 <5=> 5 <6=> 6 <7=> 7 <8=> 8 <9=> 9 <10=> 10
// <11=> 11 <12=> 12 <13=> 13 <14=> 14 <15=> 15 <16=> 16 <17=> 17 <18=> 18 <19=> 19 <20=> 20
// <21=> 21 <22=> 22 <23=> 23 <24=> 24 <25=> 25 <26=> 26 <27=> 27 <28=> 28 <29=> 29 <30=> 30 <31=> 31
#define __SYSCFG_DATE 2
// <o> 周
// <1=> 一 <2=> 二 <3=> 三 <4=> 四 <5=> 五 <6=> 六 <7=> 日
#define __SYSCFG_WEEK 5
#define SYSCFG_MANUFACTUREDATE __SYSCFG_YEAR / 100, __SYSCFG_YEAR % 100, __SYSCFG_MONTH, __SYSCFG_DATE, 0, 0, 0, __SYSCFG_WEEK
// </h>
// </e>
// <o> 任务名称文本模式
// <0=> 遗产模式 <1=> 标准模式 <2=> 兼容模式
// <i> 遗产模式:创建任务-尾参数,无功能定义、可随意输入,任务名称文本自动引用任务名称。
// <i> 标准模式:创建任务-尾参数,为任务名称文本。
// <i> 兼容模式:创建任务-尾参数如果输入字符串则为任务名称文本如果输入0任务名称文本自动引用任务名称。
// <i> 兼容模式,某些编译器不能正常支持。
#define __SYSCFG_CREATETASKCUSTOM 0
// </h>
///////////////////////////////////////////////////////////////////////////////
//*** <<< end of configuration section >>> ***//
///////////////////////////////////////////////////////////////////////////////
#if (__SYSCFG_MCUCORE == 1)
#define SYSCFG_MCUCORE 8051
#elif (__SYSCFG_MCUCORE == 2)
#define SYSCFG_MCUCORE 80251
#elif (__SYSCFG_MCUCORE == 3)
#define SYSCFG_MCUCORE cmx // Cortex-M
#endif
#if (SYSCFG_DEBUGGING == 0)
#define SYSCFG_PENDSVFIFO_MONITOR 0
#define SYSCFG_TASKPC_MONITOR 0
#define SYSCFG_RUNTIME_COUNT 0
#define SYSCFG_SYSTICKTIME_COUNT 0
#define SYSCFG_RTC_SHOW 0
#endif
#if (__SYSCFG_STARTERCREATE == 0)
#define SYSCFG_STARTERCREATE u
#else
#define SYSCFG_STARTERCREATE d
#endif
#if (__SYSCFG_CREATETASKCUSTOM == 0)
#define SYSCFG_CREATETASKCUSTOM(name, res) #name
#elif (__SYSCFG_CREATETASKCUSTOM == 1)
#define SYSCFG_CREATETASKCUSTOM(name, res) res
#elif (__SYSCFG_CREATETASKCUSTOM == 2)
#define SYSCFG_CREATETASKCUSTOM(name, res) res ? res : #name
#endif
#ifdef SYSCFG_TASKNAMELEN_MAX
#if (SYSCFG_TASKNAMELEN_MAX < 10 || SYSCFG_TASKNAMELEN_MAX > 255)
#error 参数非法 of 任务名称最大长度!
#endif
#endif
#if (__SYSCFG_GLOBALTIMESHARING == 1 && __SYSCFG_FORMULATIMESHARING == 0 && __SYSCFG_CUSTOMTIMESHARING == 0)
#define SYSCFG_TIMESHARINGMODE 0
#elif (__SYSCFG_GLOBALTIMESHARING == 0 && __SYSCFG_FORMULATIMESHARING == 1 && __SYSCFG_CUSTOMTIMESHARING == 0)
#define SYSCFG_TIMESHARINGMODE 1
#elif (__SYSCFG_GLOBALTIMESHARING == 0 && __SYSCFG_FORMULATIMESHARING == 0 && __SYSCFG_CUSTOMTIMESHARING == 1)
#define SYSCFG_TIMESHARINGMODE 2
#elif (__SYSCFG_GLOBALTIMESHARING == 0 && __SYSCFG_FORMULATIMESHARING == 0 && __SYSCFG_CUSTOMTIMESHARING == 0)
#error 时间片模式未定义!
#else
#error 时间片模式重定义!
#endif
#if (SYSCFG_USERTIMINTTOTAL > 32)
#error 参数非法 of 用户定时中断总数!
#endif
#if (SYSCFG_USERTIMQRYTOTAL > 32)
#error 参数非法 of 用户定时查询总数!
#endif
#endif