/**************************************************************************//**
 * @item     CosyOS-II Config
 * @file     syscfg.h
 * @brief    OS Config File
 * @author   迟凯峰
 * @version  V1.3.0
 * @date     2024.01.29
 ******************************************************************************/

#ifndef __SYSCFG_H
#define __SYSCFG_H
#include "..\System\os_def.h"

///////////////////////////////////////////////////////////////////////////////

          //*** <<< Use Configuration Wizard in Context Menu >>> ***//

///////////////////////////////////////////////////////////////////////////////
// <h> 系统设置
// <i> 系统设置

// <o> MCU内核
// <0=> 8051 <1=> 80251 <2=> Cortex-M
// <i> 告知CosyOS您的MCU内核，CosyOS将自动包含相匹配的MCU配置文件。
#define __SYSCFG_MCUCORE                 0
#if   __SYSCFG_MCUCORE == 0
#define SYSCFG_MCUCORE                   8051
#elif __SYSCFG_MCUCORE == 1
#define SYSCFG_MCUCORE                   80251
#elif __SYSCFG_MCUCORE == 2
#define SYSCFG_MCUCORE                   cmx
#endif

// <s> 标准头文件
// <i> 定义与您的MCU相匹配的标准头文件，您的c文件中不必再包含此文件。
// <i> 示例一：STC8.H
// <i> 示例二：..\MCU\STC8.H，此种包含路径的写法，在图形用户界面输入有时会出问题，可在文本编辑界面中定义或加强校对。
// <i> 在文本编辑界面中定义时，外层应添加双引号，例如："..\MCU\STC8.H"。
#define SYSCFG_STANDARDHEAD              "STC8.H"

// <o> 系统时钟频率（HZ）
// <i> 告知CosyOS您所配置的系统时钟，单位为赫兹。
#define SYSCFG_SYSCLK                    24000000
#if SYSCFG_SYSCLK < 1000000UL
#error 非法的设置值！
#endif

// <o> 系统滴答周期（us）
// <i> 定义系统滴答定时器的溢出时间，单位为微秒。
// <i> 是CosyOS软件定时器，延时、超时、定时等操作的基本时间和步长。
// <i> 可开启系统滴答时间统计功能，您的设定值应远大于统计值。
#define SYSCFG_SYSTICKCYCLE              1000
#if SYSCFG_SYSTICKCYCLE < 1 || SYSCFG_SYSTICKCYCLE > 1000000UL
#error 非法的设置值！
#endif

// <q> 安全运行时
// <i> 是否启用安全运行时？
// <i> 安全运行时是CosyOS的安全关键技术之一，可防止某任务长期独占或超时使用处理器。
#define SYSCFG_SAFERUNTIME               1

// </h>
///////////////////////////////////////////////////////////////////////////////
// <e> DEBUG接口设置
// <i> 是否启用DEBUG接口？
// <i> DEBUG接口是您与命令行和任务管理器通讯的专用接口，您应为它专门配置一个串口。
#define SYSCFG_DEBUGGING                 1

#if SYSCFG_DEBUGGING == 0
#define SYSCFG_TASKPC_MONITOR            0
#define SYSCFG_PENDSVFIFO_MONITOR        0
#define SYSCFG_SYSTICKTIME_COUNT         0
#else

// <q> 任务PC监控
// <i> 是否启用任务PC监控？
// <i> 当任务管理器被调度运行时，被切换的任务入栈的PC值。
// <i> 当有任务出现代码运行卡死或死循环时，此功能可用来帮助用户锁定具体位置，以便查找BUG。注意，PC值为下一条汇编指令的地址。
// <i> 建议在调试阶段开启此项功能，正式的产品可禁用以提高性能。
// <i> 某任务出现代码运行卡死或死循环的表现：
// <i> 任务始终为就绪状态，且占用较高的CPU使用率，比它优先级低的任务一直都没有机会运行。
#define SYSCFG_TASKPC_MONITOR            1

// <q> PendSV_FIFO监控
// <i> 是否开启PendSV_FIFO监控？
// <i> 开启后，系统将自动监控PendSV_FIFO的实际最大占用深度，并通过任务管理器输出，输出格式为：历史最大值/设置值。
// <i> 建议在调试阶段开启此项功能，正式的产品可禁用以提高性能。
#define SYSCFG_PENDSVFIFO_MONITOR        1

// <q> 系统滴答时间统计
// <i> 是否启用系统滴答时间统计？
// <i> 统计SysTick_Handler/定时器0中断，在每个系统滴答周期运行时间的平均值。
// <i> 建议在调试阶段开启此项功能，正式的产品可禁用以提高性能。
#define SYSCFG_SYSTICKTIME_COUNT         1

#endif

// <q> 开机自动启动任务管理器
// <i> 设备开机后，是否自动启动任务管理器？
#define SYSCFG_TASKMGRAUTOSTART          1

// <o> 任务管理器默认更新速度
// <500=> 快速（500毫秒）<1000=> 中速（1秒）<2000=> 慢速（2秒）
// <i> 任务管理器默认更新速度
#define SYSCFG_TASKMGRUPSPEED            1000

// <o> 串口发送使能
// <i> 定义DEBUG接口的串口发送使能，此项您应在文本编辑界面中定义。
// <i> 示例：
// <i> 8051/251-UART1：TI = 1
// <i> STM32 - USART1：USART_ITConfig(USART1, USART_IT_TXE, ENABLE)
#define SYSCFG_DEBUGSEND                 TI = 1

// </e>
///////////////////////////////////////////////////////////////////////////////
// <h> 任务设置
// <i> 任务设置

// <o> 任务创建模式
// <0=> 静态创建模式 <1=> 平衡创建模式 <2=> 动态创建模式
// <i> 静态创建模式：任务节点和任务栈均为静态，拥有卓越性能并且安全可信（传统观念）。
// <i> 动态创建模式：任务节点和任务栈均为动态，可显著的减少静态内存占用。
// <i> 平衡创建模式：任务节点为静态，任务栈为动态，各方面均介于两者之间。
// <i> 对于8051和80251（任务栈模式为MSP模式），任务创建模式为动态创建模式或平衡创建模式时，
// <i> CosyOS将自动启用任务栈重分配机制，可有效抵御任务栈溢出的风险，建议用户考虑。
#define SYSCFG_TASKCREATEMODE            1

// <o> 任务优先级分组
// <8=> 8级 <16=> 16级 <32=> 32级 <64=> 64级 <128=> 128级 <256=> 256级
// <i> 共有六个分组可供选择，8级、16级、32级、64级、128级、256级，您也可在文本编辑界面中自定义分组或级数。
// <i> CosyOS的任务优先级，数值越大优先级越高，数值越小优先级越低，最低优先级固定为0级。
// <i> 如您配置的分组为8级，则最高优先级为7级，最低优先级为0级。
#define SYSCFG_TASKPRIORITY              8

// <h> 时间片模式
// <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_ALGORITHMTIMESHARING    0
// <o> 时间片算法
// <i> 时间片 = f(tpl)，tpl为优先级。
// <i> 应在文本编辑界面中定义。
// <i> 示例：(256 - tpl)
#define SYSCFG_ALGORITHMTIMESHARING(tpl) (tpl)
// </e>

// <e> 自定义时间片
// <i> 是否启用自定义时间片？
#define __SYSCFG_CUSTOMTIMESHARING       0
// <o> 时间片数组
// <i> 从优先级0级开始，逐个写出各优先级的时间片并用逗号间隔。
// <i> 应在文本编辑界面中定义。
// <i> 示例（优先级分组为8级时）：80,70,60,50,40,30,20,10
#define SYSCFG_CUSTOMTIMESHARING         80,70,60,50,40,30,20,10
// <o> 时间片最大值
// <i> 时间片最大值
#define SYSCFG_TIMESHARING_MAX           255
// </e>

#if   __SYSCFG_GLOBALTIMESHARING == 1 && __SYSCFG_ALGORITHMTIMESHARING == 0 && __SYSCFG_CUSTOMTIMESHARING == 0
#define SYSCFG_TIMESHARINGMODE           0
#elif __SYSCFG_GLOBALTIMESHARING == 0 && __SYSCFG_ALGORITHMTIMESHARING == 1 && __SYSCFG_CUSTOMTIMESHARING == 0
#define SYSCFG_TIMESHARINGMODE           1
#elif __SYSCFG_GLOBALTIMESHARING == 0 && __SYSCFG_ALGORITHMTIMESHARING == 0 && __SYSCFG_CUSTOMTIMESHARING == 1
#define SYSCFG_TIMESHARINGMODE           2
#elif __SYSCFG_GLOBALTIMESHARING == 0 && __SYSCFG_ALGORITHMTIMESHARING == 0 && __SYSCFG_CUSTOMTIMESHARING == 0
#error 时间片模式未定义！
#else
#error 时间片模式重定义！
#endif

// </h>

// <o> 用户任务总数
// <i> 仅指用户任务，不包括系统任务，数量不限。
// <i> 此项参数应大于等于实际的数量，但不可小于。大了只会多占用一些内存，小了会导致某些任务无法运行或运行异常。
#define SYSCFG_USERTASKTOTAL             8

// <o> 用户定时中断总数
// <i> 取值范围：<0-64>
// <i> 用户创建的定时中断任务/钩子总数。
// <i> 此项参数应等于实际的数量，既不能大于也不能小于。不过您无需担心会出错，因为只要与实际不符，编译器就会报错。
#define SYSCFG_USERTIMINTTOTAL           0
#if SYSCFG_USERTIMINTTOTAL > 64
#error 非法的设置值！
#endif

// <o> 用户定时查询总数
// <i> 取值范围：<0-64>
// <i> 用户创建的定时查询任务/钩子总数。
// <i> 此项参数应等于实际的数量，既不能大于也不能小于。不过您无需担心会出错，因为只要与实际不符，编译器就会报错。
#define SYSCFG_USERTIMQRYTOTAL           0
#if SYSCFG_USERTIMQRYTOTAL > 64
#error 非法的设置值！
#endif

// <o> 任务名称最大长度
// <i> 取值范围：<8-255>
// <i> 任务名称应尽量简短，不可过长，因为它会对总的flash和内存占用有着一定的影响。
#define SYSCFG_TASKNAMELEN_MAX           16
#if SYSCFG_TASKNAMELEN_MAX < 8 || SYSCFG_TASKNAMELEN_MAX > 255
#error 非法的设置值！
#endif

// </h>
///////////////////////////////////////////////////////////////////////////////
// <h> 钩子函数设置
// <i> 钩子函数设置

// <q> 滴答钩子
// <i> 是否启用滴答钩子？
#define SYSCFG_TICKHOOK                  1

// <q> 空闲钩子
// <i> 是否启用空闲钩子？
#define SYSCFG_IDLEHOOK                  1

// <q> 中断服务钩子
// <i> 是否启用中断服务钩子？
#define SYSCFG_PENDSVHOOK                1

// <q> 全局变量钩子
// <i> 是否启用全局变量钩子？
#define SYSCFG_GVARHOOK                  1

// </h>
///////////////////////////////////////////////////////////////////////////////
// <h> 软件定时器设置
// <i> 软件定时器设置

// <o> 延时定时器位数/延时超时最大有效值（系统滴答周期数）
// <8=> 8位/254 <16=> 16位/65,534 <32=> 32位/4,294,967,294 <64=> 64位
// <i> 如果您的MCU内核为8051，此项建议尽量配置为低位（8位/16位），这将使大部分任务服务的执行效率提升约10%。
#define SYSCFG_DELAYBITS                 32

// <o> 定时中断定时器位数/定时最大有效值（系统滴答周期数）
// <8=> 8位/254 <16=> 16位/65,534 <32=> 32位/4,294,967,294 <64=> 64位
// <i> 如果您的MCU内核为8051，此项建议尽量配置为低位，以提高性能。
#define SYSCFG_TIMINTBITS                32

// <o> 定时查询定时器位数/定时最大有效值（系统滴答周期数）
// <8=> 8位/254 <16=> 16位/65,534 <32=> 32位/4,294,967,294 <64=> 64位
// <i> 如果您的MCU内核为8051，此项建议尽量配置为低位，以提高性能。
#define SYSCFG_TIMQRYBITS                32

// </h>
///////////////////////////////////////////////////////////////////////////////
// <h> 线程通信设置
// <i> 线程通信设置

// <q> 互斥信号量
// <i> 是否启用互斥信号量？
#define SYSCFG_MUTEX                     1

// <q> 二值信号量
// <i> 是否启用二值信号量？
#define SYSCFG_BINARY                    1

// <e> 计数信号量
// <i> 是否启用计数信号量？
#define SYSCFG_SEMAPHORE                 1
// <o> 计数信号量位数/最大值
// <8=> 8位/255 <16=> 16位/65,535 <32=> 32位/4,294,967,295 <64=> 64位
// <i> 如果您的MCU内核为8051，此项建议尽量配置为低位，以提高性能。
#define SYSCFG_SEMAPHOREBITS             32
// </e>

// <q> 事件标志组
// <i> 是否启用事件标志组？
#define SYSCFG_FLAGGROUP                 1

// <e> 私信
// <i> 是否启用私信？
#define SYSCFG_TASKMSG                   1
// <o> 私信创建模式
// <0=> 智能创建模式 <1=> 性能创建模式
// <i> 私信创建模式：智能创建模式、性能创建模式。Cortex-M内核，仅支持智能创建模式。
// <i> 智能创建模式：内存占用较多，发送私信效率低；对于8051、80251内核，直接声明和创建任务即可。对于Cortex-M内核，需使用预处理指令相配合，详情请参阅API相关说明和示例。
// <i> 性能创建模式：内存占用较少，发送私信效率高；需使用预处理指令相配合，详情请参阅API相关说明和示例。
#define SYSCFG_TASKMSGMODE               1
// </e>

// <q> 飞信
// <i> 是否启用飞信？
#define SYSCFG_FETION                    1

// <e> 消息邮箱
// <i> 是否启用消息邮箱？
#define SYSCFG_MAILBOX                   1
// <o> 互斥访问机制
// <0=> 互斥访问 <1=> 重入访问
// <i> 互斥访问：在中断中接收邮件时，如果邮箱正在被写入，将返回失败（false）。
// <i> 重入访问：在中断中接收邮件时，如果邮箱正在被写入，仍可成功接收邮件（将读取写入过程所读取的局部邮箱）。
// <i> 互斥访问相较重入访问，可节约更多的内存、减少代码量，并提高访问效率。
#define SYSCFG_MAILBOX_ACCESSMECHANISM   1
// </e>

// <q> 消息队列
// <i> 是否启用消息队列？
#define SYSCFG_MSGQUEUE                  1

// </h>
///////////////////////////////////////////////////////////////////////////////
// <h> 杂项设置
// <i> 杂项设置

// <q> 用户动态内存分配
// <i> 您在任务中是否使用动态内存分配？包括进程内存分配和线程内存分配。
#define SYSCFG_DYNMEMMGE                 1

// <e> 软件RTC
// <i> 是否启用软件RTC？
#define SYSCFG_SOFTRTC                   1

// <h> 生产日期

// <o> 年
// <2023=> 2023 <2024=> 2024 <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                    2023

// <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                   3

// <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                    7

// <o> 周
// <1=> 一 <2=> 二 <3=> 三 <4=> 四 <5=> 五 <6=> 六 <7=> 日
#define __SYSCFG_WEEK                    2

#define SYSCFG_MANUFACTUREDATE           __SYSCFG_YEAR, __SYSCFG_MONTH, __SYSCFG_DATE, 0, 0, 0, __SYSCFG_WEEK

// </h>
// </e>
// </h>
///////////////////////////////////////////////////////////////////////////////

                //*** <<< end of configuration section >>> ***//

///////////////////////////////////////////////////////////////////////////////

#endif
