/**************************************************************************//**
 * @item     CosyOS-III Config
 * @file     mcucfg_cmx.h
 * @brief    CMSIS Cortex-M Core Config File
 * @author   迟凯峰
 * @version  v3.0.0
 * @date     2026.07.21
 ******************************************************************************/

#ifndef __MCUCFG_CMX_H
#define __MCUCFG_CMX_H

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

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

///////////////////////////////////////////////////////////////////////////////
// <o> 系统中断配置
// <3=> SysTick_Handler + PendSV_Handler <0=> TIMn_IRQHandler + XXXx_IRQHandler
// <i> ------------------------------------------------------------------------
// <i> SysTick_Handler + PendSV_Handler
// <i> 要求MCU必须有BASEPRI寄存器，同时不能调用xMaskingPRI和xResumePRI进出全局临界区，也不允许私自使用BASEPRI寄存器。
// <i> 如Cortex-M0/M0+等内核，都没有BASEPRI寄存器，就不能采用此方案。
// <i> 又如虽使用了Cortex-M3/M4/M7等内核，但却想调用xMaskingPRI和xResumePRI来实现不同掩蔽范围的全局临界区保护，也不能采用此方案。
// <i> 采用此方案，用户另需在 mcucfg_cm3.h 中继续配置其它的相关定义项。
// <i> ------------------------------------------------------------------------
// <i> TIMn_IRQHandler + XXXx_IRQHandler
// <i> 用TIMn替代SysTick，TIMn_IRQHandler替代SysTick_Handler，XXXx_IRQHandler替代PendSV_Handler。
// <i> CosyOS将不会使用SysTick、SysTick_Handler、PendSV_Handler、BASEPRI寄存器，如果MCU有BASEPRI寄存器，可调用xMaskingPRI和xResumePRI进出全局临界区。
// <i> TIMn_IRQHandler 与 XXXx_IRQHandler 必须满足如下关系：TIMn_IRQn / 32 == XXXx_IRQn / 32。
// <i> 采用此方案，用户另需在 mcucfg_cm0.h 中继续配置其它的相关定义项。
#define MCUCFG_SYSINT                   3

///////////////////////////////////////////////////////////////////////////////
// <o> 中断FIFO服务装载器-互斥访问方案
// <1=> 互斥访问指令 <255=> 互斥访问机制 <0=> 关闭总中断
// <i> ------------------------------------------------------------------------
// <i> 互斥访问指令
// <i> 仅适用于Cortex-M3/M4/M7等支持互斥访问指令[LDREX/STREX]的内核，可实现全局不关总中断、零中断延迟。
// <i> ------------------------------------------------------------------------
// <i> 互斥访问机制
// <i> 仅推荐于Cortex-M0/M0+等不支持互斥访问指令[LDREX/STREX]的内核，可实现全局不关总中断、零中断延迟。
// <i> 全局寄存器变量
// <i> 首先需要定义一个全局寄存器变量（系统默认定义为r6），专用于互斥访问：
// <i> 1、For Arm Compiler 4/5, CosyOS has already defined the register variable r6.
// <i> 2、For Arm Compiler 6, please set -ffixed-r6, use Project > Options > C/C++ (AC6) > Misc Controls.
// <i> 3、For GNU Compiler, CosyOS has already defined the register variable r6.
// <i> 4、For IAR Compiler, please set --lock_regs=r6, use Project > Options > C/C++ Compiler > Extra Options.
// <i> 5、For Other Compiler, CosyOS暂不能提供有效定义全局寄存器变量的方法，建议选择其它方案。
// <i> 服务调用规约
// <i> 仅允许用户在连续两级中断优先级的用户中断中调用【中断FIFO服务】，推荐的方案是：
// <i> 1、所有用户中断都不要使用最低优先级（中断优先级号：3）；
// <i> 2、中断优先级号：2、1 的用户中断中可以随意调用【中断FIFO服务】；
// <i> 3、中断优先级号：0和负值的用户中断中不允许调用【中断FIFO服务】。
// <i> 注：中断优先级号为负值的中断通常仅包括 Reset_Handler、NMI_Handler、HardFault_Handler。
// <i> 用户需严格遵守上述的服务调用规约，否则可能会对系统可靠性造成不利影响。
// <i> ------------------------------------------------------------------------
// <i> 关闭总中断
// <i> 适用于所有ARM内核，并具有极短的、确定的关闭总中断时间，包括关闭总中断、再次开启总中断在内，
// <i> 共10个指令周期（嵌套方式）；如果是非嵌套方式，仅为7个指令周期。
// <i> 内核关闭总中断仅发生在 port_cmx_s.c 中，“中断FIFO服务装载器” 中的 “FIFO计数” 段。
// <i> ------------------------------------------------------------------------
// <i> 配置技巧：
// <i> 用户可优先选择 “互斥访问指令” 编译尝试，如果内核不支持该指令，编译器会给出明确提示，此时再更换其它方案。
#define MCUCFG_PENDSVFIFO_MUTEX         1

// <q> 关闭总中断-嵌套方式
// <i> 当“中断FIFO服务装载器-互斥访问方案”选择关闭总中断时，是否采用嵌套方式？
// <i> 如果用户在中断中使用了中断锁（xDisableIRQ/xResumeIRQ）或自行关闭总中断（操作PRIMASK），推荐采用嵌套方式。
// <i> 否则可关闭嵌套方式，缩短内核关闭总中断时间（将缩短至7个指令周期）。
#define MCUCFG_PENDSVFIFO_XXXXX         1

///////////////////////////////////////////////////////////////////////////////
// <q> 浮点寄存器上下文自动保存
// <i> 是否启用浮点寄存器的上下文自动保存功能？
// <i> 如果存在并且启用了硬件浮点单元，同时在多个任务和中断中都要进行浮点运算，可考虑开启该选项。
#define MCUCFG_ASPEN_LSPEN              0

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

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

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

#endif
