/**************************************************************************//** * @item CosyOS-III Config * @file syscfg.h * @brief OS Config File * @author 迟凯峰 * @version v3.1.2 * @date 2026.09.06 ******************************************************************************/ #ifndef __SYSCFG_H #define __SYSCFG_H /////////////////////////////////////////////////////////////////////////////// //*** <<< Use Configuration Wizard in Context Menu >>> ***// /////////////////////////////////////////////////////////////////////////////// // 系统配置 // 系统配置 // 处理器架构 // <1=> 8051 <2=> 80251 <3=> Cortex-M <4=> RISC-V32 // 告知CosyOS您的处理器架构,CosyOS将自动包含相匹配的MCU配置文件和PORT文件。 #define __SYSCFG_MCUCORE 3 // 标准头文件 // 定义与您的MCU相匹配的标准头文件,您的c文件中不必再包含此文件。 // 注意:在文本编辑界面中定义时,外层应添加双引号,如:"main.h"。 // 对于STM32,无论是标准外设库还是HAL库,通常定义为"main.h"即可。 #define SYSCFG_STANDARDHEAD "main.h" // 系统滴答周期(us) // 告知CosyOS系统滴答定时器的溢出时间,单位为微秒。 // 是CosyOS软件定时器,延时、超时、定时等操作的基本时间。 // 可开启系统滴答时间统计功能,您的设定值应远大于统计值。 #define SYSCFG_SYSTICK_CYCLE 1000 // 内核锁嵌套 // 内核锁是否支持嵌套调用? // 通常您可能不会用到内核锁,即使偶尔使用也应是极简的代码、一般不会嵌套调用。 #define SYSCFG_KERNELLOCKNESTING 0 // 安全运行时 // 是否启用安全运行时? // 安全运行时是CosyOS的安全关键技术之一,可防止某任务长期独占或超时使用处理器。 #define SYSCFG_SAFERUNTIME 0 // 安全运行时计数器位数 // <8=> 8位 <16=> 16位 <32=> 32位 // 如果MCU内核为8051,此项建议尽量配置为低位,以提高性能。 #define SYSCFG_SRTIME_BITS 32 // // 低功耗模式 // 是否启用低功耗模式? // 如果开启该选项,CosyOS会在系统空闲任务中进入低功耗模式。 // 低功耗模式通常为空闲模式、睡眠模式,可被中断唤醒,但未必所有中断都能唤醒。 // 您也可不启用该功能,并自行配置自己的低功耗,在 idle_hook 中。 #define SYSCFG_LOWPOWERMODE 0 // 中断FIFO服务 // 中断FIFO服务 // PendSV_FIFO深度 // 1、此项参数取决于您在中断中调用的FIFO服务总数及中断的频率。 // 2、对于8051来说,该值只能在 0/8/16/24/32/40 之中选取,其中0为不使用中断FIFO服务。 // 3、对于80251来说,如果中断FIFO服务装载器-互斥访问方案选择为[JBC]指令, // 该值只能在 0/8/16/24/32/40 之中选取,其中0为不使用中断FIFO服务。 // 4、对于80251来说,如果中断FIFO服务装载器-互斥访问方案选择为[INC]指令或关闭总中断, // 该值可在 0~127 之间选取,其中0为不使用中断FIFO服务。 // 5、对于 ARM、RISC-V 等新型架构来说,该值可在 0~255 之间选取,其中0为不使用中断FIFO服务。 // 6、可开启PendSV_FIFO监控功能,监控历史上的最大值,再适当增大,以确保其不会溢出。 #define SYSCFG_PENDSVFIFO_DEPTH 32 // 中断FIFO服务处理器-最大并发执行数 // 中断FIFO服务处理器在一次运行中,允许执行服务的最大数量。 // 如果超出这个数值,中断FIFO服务处理器将主动退出运行,而后继续执行任务调度/切换。 // 该功能可防止因中断FIFO服务的多阶段持续并发而导致的中断FIFO服务处理器死锁(永远有执行不完的服务), // 并最终导致任务不能调度运行。 // 该值通常建议在PendSV_FIFO深度值的2~10倍之间选取,不建议过大或过小。 // 可开启PendSV_FIFO监控功能,监控实际并发执行数在历史上的最大值,如果过大说明设计存在不合理因素, // 应设法予以解决。 #define SYSCFG_PENDSVFIFO_COUNT 256 // 中断FIFO服务-错误调用返回 // 是否启用中断FIFO服务-错误调用返回? // 启用该功能后,当中断FIFO服务执行失败时,可在相应的回调函数中处理善后。 #define SYSCFG_PENDSVFIFO_ERRORCALLBACK 0 // // /////////////////////////////////////////////////////////////////////////////// // DEBUG配置 // 是否启用DEBUG? // DEBUG包括命令行与任务管理器,启用DEBUG后,CosyOS会自动创建两个系统任务 // 来实现相关功能,它们分别是: // 系统调试器:Debugger [maxpri] // 任务管理器:Taskmgr [maxpri-1] #define SYSCFG_DEBUGGING 0 #if (SYSCFG_DEBUGGING == 1) // 任务名称标识 // <0=> 遗产模式 <1=> 标准模式 <2=> 兼容模式 // 遗产模式:创建任务-尾参数,无功能定义、可随意输入,任务名称标识自动引用任务名称。 // 标准模式:创建任务-尾参数,为任务名称标识。 // 兼容模式:创建任务-尾参数,如果输入字符串,则为任务名称标识;如果输入0,任务名称标识自动引用任务名称。 // 兼容模式,某些编译器(Keil C51、C251),不能正常支持。 #define __SYSCFG_CREATETASKCUSTOM 2 // 任务名称最大长度 // 取值范围:<8-255> // 任务名称应尽量简短,不可过长,因为它会对总的flash和内存占用有着一定影响。 #define SYSCFG_TASKNAMELEN_MAX 16 // 在线用户任务总数 // 当相同优先级任务调度算法未选择无调度时,应定义此项。 // 仅指启动并加入到任务队列的用户任务总数,不包括未启动的任务和系统任务。 // 此项参数应大于等于实际的数量,但不可小于。 #define SYSCFG_USERTASKTOTAL 16 // 任务管理器监控选项 // 任务管理器监控选项 // PSV-FIFO监控 // 是否开启PendSV_FIFO监控? // 开启后,系统将自动监控PendSV_FIFO的实际最大占用深度,并通过任务管理器输出,输出格式为:历史最大值/设置值。 // 建议在调试阶段开启此项功能,正式的产品可禁用以提高性能。 #define SYSCFG_PENDSVFIFO_MONITOR 1 // 任务pc值监控 // 是否启用任务pc值监控? // 当任务管理器被调度运行时,被切换的任务入栈的PC值。 // 当有任务出现代码运行卡死或死循环时,此功能可用来帮助用户锁定具体位置,以便查找BUG。注意,pc值为下一条汇编指令的地址。 // 建议在调试阶段开启此项功能,正式的产品可禁用以提高性能。 // 某任务出现代码运行卡死或死循环的表现:任务始终为就绪状态,且占用较高的CPU使用率,比它优先级低的任务一直都没有机会运行。 #define SYSCFG_TASKPC_MONITOR 1 // 运行时间统计 // 是否启用运行时间统计? #define SYSCFG_RUNTIME_COUNT 1 // 滴答时间统计 // 是否启用系统滴答时间统计? // 统计系统滴答定时器中断,在每个系统滴答周期运行时间的平均值。 // 建议在调试阶段开启此项功能,正式的产品可禁用以提高性能。 #define SYSCFG_SYSTICKTIME_COUNT 1 // 当前时间显示 // 是否显示当前时间? // 如果有硬件RTC或启用了软件RTC,可考虑开启该功能。 // 如果启用了软件RTC,任务管理器会通过软件RTC来获取当前时间; // 如果未启用软件RTC(已经有硬件RTC),任务管理器会通过RTC钩子来获取当前时间,此时您应完善 rtc_hook 中的代码。 #define SYSCFG_RTC_SHOW 0 // #endif // 开机自动启动任务管理器 // 设备开机后,是否自动启动任务管理器? #define SYSCFG_TASKMGR_AUTOSTART 1 // 任务管理器默认更新速度 // <500=> 快速(500毫秒)<1000=> 中速(1秒)<2000=> 慢速(2秒) // 任务管理器默认更新速度 #define SYSCFG_TASKMGR_UPSPEED 1000 // DEBUG钩子是否传参数据包长度 // DEBUG发送的数据均为字符串,且带有字符串尾'\0',如果用户需要获取数据包长度,可开启该选项。 #define SYSCFG_DEBUG_SENDLEN 1 // DEBUG输出语言 // <0=> English <1=> 中文 // DEBUG输出语言 #define SYSCFG_DEBUG_LANGUAGE 1 // DEBUG输出编码 // <0=> UTF-8 <1=> GB2312 // DEBUG输出编码 // 如果任务名称标识使用中文,DEBUG输出编码可选 UTF-8、GB2312。 // 实际操作中注意四个一致,任务名称便能正确显示中文、不会乱码: // 任务名称标识定义所在文件编码、DEBUG输出编码、编译器编码设置、CosyOS3Shell/串口助手编码设置。 #define SYSCFG_DEBUG_ENCODING 1 // /////////////////////////////////////////////////////////////////////////////// // 系统任务配置 // 系统任务配置 // Debugger-StackSize // 系统调试器的任务栈大小,单位为字节数(Bytes)。 #define SYSCFG_STACKSIZE_DEBUGGER 384 // Taskmgr-StackSize // 任务管理器的任务栈大小,单位为字节数(Bytes)。 #define SYSCFG_STACKSIZE_TASKMGR 384 // Starter-StackSize // 任务启动器的任务栈大小,单位为字节数(Bytes)。 #define SYSCFG_STACKSIZE_STARTER 512 // Sysidle-StackSize // 系统空闲任务的任务栈大小,单位为字节数(Bytes)。 #define SYSCFG_STACKSIZE_SYSIDLE 384 // 任务栈重分配增量 // 当任务栈模式为MSP模式、任务为动态创建时,CosyOS将自动启用任务栈重分配机制,以抵御任务栈溢出的风险。 // 通过合理的配置一个重分配增量,可有效降低重分配的次数,减少内存碎片。 // 此值的设置适当就好,不建议过大或过小。 #define SYSCFG_TASKSTACK_REALLOCINC 16 // Starter-创建模式 // <0=> 静态创建 <1=> 动态创建 // 一般情况下,推荐采用动态创建,Starter删除自身后,内存可被回收; // 但用户千万不要忘记配置足够大的内存池或HEAP。 #define __SYSCFG_STARTERCREATE 0 // /////////////////////////////////////////////////////////////////////////////// // 全局任务配置 // 全局任务配置 // 任务PICK位图 // <1=> 128字节 <2=> 256字节 // 128字节PICK位图占用128字节常量内存; // 256字节PICK位图占用256字节常量内存; // 256字节PICK位图的任务调度性能优于128字节PICK位图。 #define SYSCFG_TASKPICKBITMAP 1 // 任务优先级总数 // CosyOS的任务优先级,数值越大优先级越高,数值越小优先级越低,最低优先级固定为0级。 // 如任务优先级总数为8,则最高优先级为7级,最低优先级为0级。 // 如果未启用DEBUG接口,系统会占用两级优先级,包括最高一级和最低一级; // 如果启用了DEBUG接口,系统会占用四级优先级,包括最高三级和最低一级; // 设置任务优先级总数,应有分组意识,如8级不够用应尽量控制在64级内;如64级不够用,最大可为256; // 原因是: // <=8:任务就绪表为零级位图,占用内存最少、调度性能最佳; // <=64:任务就绪表为一级位图,占用内存适中、调度性能适中; // <=256:任务就绪表为二级位图,占用内存最多、调度性能最低。 #define SYSCFG_TASKPRIORITY 16 // 相同优先级任务调度算法 // <0=> 无调度 <1=> 协作式调度 <2=> 时间片轮转调度 // 对于 CosyOS 来说,不同优先级的任务,永远都实行抢占式调度; // 而相同优先级的任务,则分为无调度、协作式调度、时间片轮转调度。 // 无调度,是指不支持相同优先级的任务调度,每个任务的优先级都必须不同。 // 时间片轮转调度,是指相同优先级的各个任务,享有相同的运行时间(时间片),轮流运行。 // 协作式调度,要求任务必须主动禅让处理器使用权,才能切换至下一个相同优先级的任务运行。 // 在未经深思熟虑时,应优先选择时间片轮转调度,以保证相同优先级任务的平等运行机会。 #define SYSCFG_SAMEPRISCHEDULE 2 // 时间片模式 // 当相同优先级任务调度算法选择为时间片轮转调度时,应定义此项。 // CosyOS有三种时间片的定义模式,全局时间片、算法时间片、自定义时间片,您只能选其一。 // 全局时间片,所有任务采用相同的时间片。 // 算法时间片,不同优先级的任务,时间片不同,采用一个算法公式来描述。 // 自定义时间片,不同优先级的任务,时间片不同,用户自定义各优先级的时间片。 // 全局时间片,简单高效,时间片轮转调度性能为最佳;算法时间片、自定义时间片,可实现不同优先级的、精细的时间片控制。 // 时间片的取值范围:<1-65535>,单位为滴答周期。 // 全局时间片 // 是否启用全局时间片? #define __SYSCFG_GLOBALTIMESHARING 1 // 时间片时间 // 时间片时间 #define SYSCFG_GLOBALTIMESHARING 100 // // 算法时间片 // 是否启用算法时间片? #define __SYSCFG_FORMULATIMESHARING 0 // 时间片算法公式 // 时间片 = f(pri),pri为任务优先级。 // 应在文本编辑界面中定义,默认定义为示例。 #define SYSCFG_FORMULATIMESHARING(pri) ((SYSCFG_TASKPRIORITY - pri) * 5) // // 自定义时间片 // 是否启用自定义时间片? #define __SYSCFG_CUSTOMTIMESHARING 0 // 时间片数组 // 从优先级0级开始,逐个写出各优先级的时间片并用逗号间隔。 // 应在文本编辑界面中定义,默认定义为示例,任务优先级总数为16。 #define SYSCFG_CUSTOMTIMESHARING 100,90,80,70,60,50,40,30,20,10,7,5,4,3,2,1 // 时间片最大值 // 时间片最大值 #define SYSCFG_TIMESHARING_MAX 255 // // // 任务定时器时间轮槽数 // <1=> 2个 <2=> 4个 <3=> 8个 <4=> 16个 <5=> 32个 <6=> 64个 <7=> 128个 <8=> 256个 // <251=> 自动配置(性能)<253=> 自动配置(平衡)<256=> 自动配置(节约内存) // 时间轮槽数越多,定时器的计数效率就会越高、但这同时也意味着更多的内存资源占用。 // 时间轮槽数过多也是没有必要的,最多选择与任务总数较为接近的数值即可。 // 时间轮槽数只能从选项中选取,用户不可擅自定义其它数值。 #define SYSCFG_TIMESLOTBITS 253 // 任务定时器位数 // <8=> 8位 <16=> 16位 <32=> 32位 // 如果MCU内核为8051,此项建议尽量配置为低位(8位/16位),这将使大部分任务服务的执行效率提升约10%。 #define SYSCFG_DELAY_BITS 32 // /////////////////////////////////////////////////////////////////////////////// // 定时中断/查询设置 // 定时中断/查询设置 // 用户定时中断总数 // 取值范围:<0-32> // 用户创建的定时中断任务/钩子总数。 // 此项参数应等于实际的数量,既不能大于也不能小于。 // 如果定义数量大于实际数量,会引起编译器警告,否则不会有任何提示。 #define SYSCFG_USERTIMINTTOTAL 0 // 用户定时查询总数 // 取值范围:<0-32> // 用户创建的定时查询任务/钩子总数。 // 此项参数应等于实际的数量,既不能大于也不能小于。 // 如果定义数量大于实际数量,会引起编译器警告,否则不会有任何提示。 #define SYSCFG_USERTIMQRYTOTAL 0 // 用户定时查询初始化状态 // <0=> 停止状态 <1=> 查询状态 // 停止状态:用户的定时查询,在初始化后为停止状态,不能计数也不能查询用户定义的事件。 // 查询状态:用户的定时查询,在初始化后为查询状态,系统已经开始查询用户定义的事件了。 #define SYSCFG_USERTIMQRYINIT 1 // 定时中断定时器位数 // <8=> 8位 <16=> 16位 <32=> 32位 // 如果MCU内核为8051,此项建议尽量配置为低位,以提高性能。 #define SYSCFG_TIMINT_BITS 32 // 定时查询定时器位数 // <8=> 8位 <16=> 16位 <32=> 32位 // 如果MCU内核为8051,此项建议尽量配置为低位,以提高性能。 #define SYSCFG_TIMQRY_BITS 32 // /////////////////////////////////////////////////////////////////////////////// // 钩子函数设置 // 钩子函数设置 // 空闲钩子 // 是否启用空闲钩子? #define SYSCFG_IDLEHOOK 0 // 滴答钩子 // 是否启用滴答钩子? #define SYSCFG_TICKHOOK 0 // 挂起服务钩子 // 是否启用挂起服务钩子? #define SYSCFG_PENDSVHOOK 0 // /////////////////////////////////////////////////////////////////////////////// // 线程通信设置 // 线程通信设置 // 互斥信号量 // 是否启用互斥信号量? #define SYSCFG_MUTEX 1 // 天花板基本优先级 // 当相同优先级任务调度算法选择无调度时,应定义此项。 // 此时,互斥信号量将采用优先级天花板机制,来抑制优先级反转的发生。 // CosyOS的优先级天花板有别于传统RTOS,该天花板为一个连续的任务优先级, // 天花板优先级的数量,取决于您在任务中嵌套获取不同互斥量的最大深度。 // 所有天花板优先级都应做为保留,所有任务都不应该主动占用它们。 // 您应在此定义天花板优先级的最低级。 // 示例: // 任务优先级数 = 64,其中[63~61]被系统占用,[60~56]被您的高优先级任务占用(这些任务都不可以再使用互斥量); // 您在任务中嵌套获取不同互斥量的最大深度 = 3; // => // 天花板基本优先级 = 56-3 = 53,[53~55]为天花板优先级,您不可擅自使用它们。 #define SYSCFG_BASEPRI_CEILING 53 // // 二值信号量 // 是否启用二值信号量? #define SYSCFG_BINARY 1 // 计数信号量 // 是否启用计数信号量? #define SYSCFG_SEMAPHORE 1 // 计数信号量位数 // <8=> 8位 <16=> 16位 <32=> 32位 // 如果MCU内核为8051,此项建议尽量配置为低位,以提高性能。 #define SYSCFG_SEMAPH_BITS 32 // // 事件标志组 // 是否启用事件标志组? #define SYSCFG_FLAGGROUP 1 // 私信 // 是否启用私信? #define SYSCFG_TASKMSG 1 // 飞信 // 是否启用飞信? #define SYSCFG_FETION 1 // 消息邮箱 // 是否启用消息邮箱? #define SYSCFG_MAILBOX 1 // 消息队列 // 是否启用消息队列? #define SYSCFG_MSGQUEUE 1 // 中断中接收 // 是否需要在用户中断中接收消息? // 如果不会在用户中断中接收消息,建议关闭该选项。 // 关闭该选项可使队列为无锁队列,性能进一步提升。 #define SYSCFG_MSGQUEUE_INTRECV 1 // // /////////////////////////////////////////////////////////////////////////////// // 杂项设置 // 杂项设置 // 用户动态内存分配 // 在任务中是否使用动态内存分配?包括进程内存分配和线程内存分配的相关服务调用。 #define SYSCFG_DYNMEMMGE 0 // 软件RTC // 是否启用软件RTC? #define SYSCFG_SOFTRTC 0 // 生产日期 // 年 // <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 // 月 // <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 // 日 // <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 // 周 // <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 // // // /////////////////////////////////////////////////////////////////////////////// //*** <<< 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 #elif (__SYSCFG_MCUCORE == 4) #define SYSCFG_MCUCORE rv32 // RISC-V32 #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 #define SYSCFG_CREATETASKCUSTOM(name, res) #name #else #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 #endif #if (__SYSCFG_STARTERCREATE == 0) #define SYSCFG_STARTERCREATE u #else #define SYSCFG_STARTERCREATE d #endif #if defined ( __C51__ ) #if ((SYSCFG_PENDSVFIFO_DEPTH % 8) || (SYSCFG_PENDSVFIFO_DEPTH > 40)) #error 参数非法 of 中断挂起服务FIFO队列深度! #endif #elif !defined ( __C251__ ) #if (SYSCFG_PENDSVFIFO_DEPTH > 255) #error 参数非法 of 中断挂起服务FIFO队列深度! #endif #endif #ifdef SYSCFG_TASKNAMELEN_MAX #if (SYSCFG_TASKNAMELEN_MAX < 8 || 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