diff --git a/Port/80251/port_80251.c b/Port/80251/port_80251.c new file mode 100644 index 0000000..6d4e465 --- /dev/null +++ b/Port/80251/port_80251.c @@ -0,0 +1,293 @@ +/**************************************************************************//** + * @item CosyOS-III Port + * @file port_80251.c + * @brief 80251 Core Port File + * @author 迟凯峰 + * @version V2.2.0 + * @date 2026.01.13 + ******************************************************************************/ + +#include "os_var.h" +#ifdef __PORT_80251_H + +s_u16_t _SYS_MEM_ m_bsp_add = sizeof(s_taskhand_ts); +static s_u8_t xdata mVOID _at_ 0; + + +/* + * 全局临界区 + */ + +static bit m_oldirq; +static volatile s_u8_t _SYS_MEM_ m_glocri_counter/**/sZeroInstall; + +void mx_disable_irq(void) +{ + if(_testbit_(EA)){ + m_oldirq = 1; + } + else if(!m_glocri_counter){ + m_oldirq = 0; + } + m_glocri_counter++; +} + +void mx_resume_irq(void) +{ + m_glocri_counter--; + if(!m_glocri_counter){ + EA = m_oldirq; + } +} + + +/* + * 中断FIFO服务 + */ + +#if (MCUCFG_PENDSVFIFO_DEPTH > 0) + +#if (SYSCFG_PENDSVFIFO_MONITOR == __ENABLED__) +s_u8_t mPendSV_FIFO_DepthMAX/**/sZeroInstall; +#endif +bit m_sign_fifo = true; +static void _STATIC_MEM_ *mPendSV_FIFO_0[MCUCFG_PENDSVFIFO_DEPTH + MCUCFG_PENDSVFIFO_MUTEX - 1] _at_ 0x0100; +static void _STATIC_MEM_ *mPendSV_FIFO_1[MCUCFG_PENDSVFIFO_DEPTH + MCUCFG_PENDSVFIFO_MUTEX - 1] _at_ 0x0200; +static void _fifo_x_(void _STATIC_MEM_ *sv) +{ + (*sPendSV_FIFOHandler[*(const s_u8_t _STATIC_MEM_ *)sv])(sv); +} + +s_u8_t _SYS_MEM_ m_fifo_0_count = MCUCFG_PENDSVFIFO_DEPTH; +s_u8_t _SYS_MEM_ m_fifo_1_count = MCUCFG_PENDSVFIFO_DEPTH; +#define mWriteCode(n) \ +bit m_sign_fifo_0_##n = true; \ +bit m_sign_fifo_1_##n = true + +mWriteCode(0); +mWriteCode(1); +mWriteCode(2); +mWriteCode(3); +mWriteCode(4); +mWriteCode(5); +mWriteCode(6); +mWriteCode(7); +#if (MCUCFG_PENDSVFIFO_DEPTH > 8) +mWriteCode(8); +mWriteCode(9); +mWriteCode(10); +mWriteCode(11); +mWriteCode(12); +mWriteCode(13); +mWriteCode(14); +mWriteCode(15); +#if (MCUCFG_PENDSVFIFO_DEPTH > 16) +mWriteCode(16); +mWriteCode(17); +mWriteCode(18); +mWriteCode(19); +mWriteCode(20); +mWriteCode(21); +mWriteCode(22); +mWriteCode(23); +#if (MCUCFG_PENDSVFIFO_DEPTH > 24) +mWriteCode(24); +mWriteCode(25); +mWriteCode(26); +mWriteCode(27); +mWriteCode(28); +mWriteCode(29); +mWriteCode(30); +mWriteCode(31); +#if (MCUCFG_PENDSVFIFO_DEPTH > 32) +mWriteCode(32); +mWriteCode(33); +mWriteCode(34); +mWriteCode(35); +mWriteCode(36); +mWriteCode(37); +mWriteCode(38); +mWriteCode(39); +#endif +#endif +#endif +#endif + +#undef mWriteCode + +void mPendSV_FIFOHandler(void) +{ + #if (SYSCFG_PENDSVFIFO_MONITOR == __ENABLED__) + s_u8_t i; + #endif + +__LABLE: + m_sign_fifo = false; + + m_sign_fifo_0_0 = true; + _fifo_x_(*(void _STATIC_MEM_ * _STATIC_MEM_ *)(mPendSV_FIFO_0 + 0)); + + #if (SYSCFG_PENDSVFIFO_MONITOR == __ENABLED__) + #define mWriteCode(n) \ + if(m_sign_fifo_0_##n){ i = n; goto __LABLE_0; } \ + m_sign_fifo_0_##n = true; \ + _fifo_x_(*(void _STATIC_MEM_ * _STATIC_MEM_ *)(mPendSV_FIFO_0 + n)) + #else + #define mWriteCode(n) \ + if(m_sign_fifo_0_##n) goto __LABLE_0; \ + m_sign_fifo_0_##n = true; \ + _fifo_x_(*(void _STATIC_MEM_ * _STATIC_MEM_ *)(mPendSV_FIFO_0 + n)) + #endif + + mWriteCode(1); + mWriteCode(2); + mWriteCode(3); + mWriteCode(4); + mWriteCode(5); + mWriteCode(6); + mWriteCode(7); + #if (MCUCFG_PENDSVFIFO_DEPTH > 8) + mWriteCode(8); + mWriteCode(9); + mWriteCode(10); + mWriteCode(11); + mWriteCode(12); + mWriteCode(13); + mWriteCode(14); + mWriteCode(15); + #if (MCUCFG_PENDSVFIFO_DEPTH > 16) + mWriteCode(16); + mWriteCode(17); + mWriteCode(18); + mWriteCode(19); + mWriteCode(20); + mWriteCode(21); + mWriteCode(22); + mWriteCode(23); + #if (MCUCFG_PENDSVFIFO_DEPTH > 24) + mWriteCode(24); + mWriteCode(25); + mWriteCode(26); + mWriteCode(27); + mWriteCode(28); + mWriteCode(29); + mWriteCode(30); + mWriteCode(31); + #if (MCUCFG_PENDSVFIFO_DEPTH > 32) + mWriteCode(32); + mWriteCode(33); + mWriteCode(34); + mWriteCode(35); + mWriteCode(36); + mWriteCode(37); + mWriteCode(38); + mWriteCode(39); + #endif + #endif + #endif + #endif + + #undef mWriteCode + + #if (SYSCFG_PENDSVFIFO_MONITOR == __ENABLED__) + if(m_fifo_0_count > mPendSV_FIFO_DepthMAX){ + mPendSV_FIFO_DepthMAX = m_fifo_0_count; + } + m_fifo_0_count = MCUCFG_PENDSVFIFO_DEPTH; + #endif +__LABLE_0: + #if (SYSCFG_PENDSVFIFO_MONITOR == __ENABLED__) + if(i > mPendSV_FIFO_DepthMAX){ + mPendSV_FIFO_DepthMAX = i; + } + #endif + + m_sign_fifo = true; + if(m_sign_fifo_1_0) return; + + m_sign_fifo_1_0 = true; + _fifo_x_(*(void _STATIC_MEM_ * _STATIC_MEM_ *)(mPendSV_FIFO_1 + 0)); + + #if (SYSCFG_PENDSVFIFO_MONITOR == __ENABLED__) + #define mWriteCode(n) \ + if(m_sign_fifo_1_##n){ i = n; goto __LABLE_1; } \ + m_sign_fifo_1_##n = true; \ + _fifo_x_(*(void _STATIC_MEM_ * _STATIC_MEM_ *)(mPendSV_FIFO_1 + n)) + #else + #define mWriteCode(n) \ + if(m_sign_fifo_1_##n) goto __LABLE_1; \ + m_sign_fifo_1_##n = true; \ + _fifo_x_(*(void _STATIC_MEM_ * _STATIC_MEM_ *)(mPendSV_FIFO_1 + n)) + #endif + + mWriteCode(1); + mWriteCode(2); + mWriteCode(3); + mWriteCode(4); + mWriteCode(5); + mWriteCode(6); + mWriteCode(7); + #if (MCUCFG_PENDSVFIFO_DEPTH > 8) + mWriteCode(8); + mWriteCode(9); + mWriteCode(10); + mWriteCode(11); + mWriteCode(12); + mWriteCode(13); + mWriteCode(14); + mWriteCode(15); + #if (MCUCFG_PENDSVFIFO_DEPTH > 16) + mWriteCode(16); + mWriteCode(17); + mWriteCode(18); + mWriteCode(19); + mWriteCode(20); + mWriteCode(21); + mWriteCode(22); + mWriteCode(23); + #if (MCUCFG_PENDSVFIFO_DEPTH > 24) + mWriteCode(24); + mWriteCode(25); + mWriteCode(26); + mWriteCode(27); + mWriteCode(28); + mWriteCode(29); + mWriteCode(30); + mWriteCode(31); + #if (MCUCFG_PENDSVFIFO_DEPTH > 32) + mWriteCode(32); + mWriteCode(33); + mWriteCode(34); + mWriteCode(35); + mWriteCode(36); + mWriteCode(37); + mWriteCode(38); + mWriteCode(39); + #endif + #endif + #endif + #endif + + #undef mWriteCode + + #if (SYSCFG_PENDSVFIFO_MONITOR == __ENABLED__) + if(m_fifo_1_count > mPendSV_FIFO_DepthMAX){ + mPendSV_FIFO_DepthMAX = m_fifo_1_count; + } + m_fifo_1_count = MCUCFG_PENDSVFIFO_DEPTH; + #endif +__LABLE_1: + #if (SYSCFG_PENDSVFIFO_MONITOR == __ENABLED__) + if(i > mPendSV_FIFO_DepthMAX){ + mPendSV_FIFO_DepthMAX = i; + } + #endif + + if(!m_sign_fifo_0_0) goto __LABLE; +} + +#endif + + + +#endif diff --git a/Port/80251/port_80251.h b/Port/80251/port_80251.h new file mode 100644 index 0000000..d758b70 --- /dev/null +++ b/Port/80251/port_80251.h @@ -0,0 +1,248 @@ +/**************************************************************************//** + * @item CosyOS-III Port + * @file port_80251.h + * @brief 80251 Core Port File + * @author 迟凯峰 + * @version V2.2.0 + * @date 2026.01.13 + ******************************************************************************/ + +#ifndef __PORT_80251_H +#define __PORT_80251_H + +/* INCLUDE */ +#include +#include "os_base.h" +#include "os_def.h" +#include "syscfg.h" +#include "mcucfg_80251.h" +#include SYSCFG_STANDARDHEAD + + +/* Memory */ +#define _SYS_MEM_ data +#define _CODE_MEM_ +#define _CONST_MEM_ +#define _STACK_MEM_ near +#define _XDATA_MEM_ xdata + #if (MCUCFG_MEMORYMODEL == 0) +#define _STATIC_MEM_ near +#define _MALLOC_MEM_ near +#define _OBJ_MEM_ near +#elif (MCUCFG_MEMORYMODEL == 1) +#define _STATIC_MEM_ near +#define _MALLOC_MEM_ near +#define _OBJ_MEM_ near +#elif (MCUCFG_MEMORYMODEL == 2) +#define _STATIC_MEM_ near +#define _MALLOC_MEM_ xdata +#define _OBJ_MEM_ +#elif (MCUCFG_MEMORYMODEL == 3) +#define _STATIC_MEM_ xdata +#define _MALLOC_MEM_ near +#define _OBJ_MEM_ +#elif (MCUCFG_MEMORYMODEL == 4) +#define _STATIC_MEM_ xdata +#define _MALLOC_MEM_ xdata +#define _OBJ_MEM_ xdata +#endif +/* + * 用户自定义内存 + * 用户可自定义下方的内存,以寻求在性能和资源之间取得平衡。默认为未定义,由内存MODEL决定。 + * 在 os_var.c、os_var.h 中,用户也可逐个查看及调整对应定义内存的变量,以实现极致的优化。 + */ +#define _RTC_MEM_ /* 软件RTC相关系统变量的内存 */ +#define _DEBUG_MEM_ /* DEBUG相关系统变量的内存 */ + + +/* Register */ +#define _SYS_REG_ + + +/* Typedef */ +#define m_boolvoid_tf *(s_boolvoid_tfp) +#ifndef bool +typedef s_u8_t bool; +#endif +typedef bit m_bit_t; +typedef s_u16_t m_sp_t; +typedef s_u32_t m_tick_t; +typedef s_u32_t m_pc_t; +typedef s_u16_t m_tqcount_t; +typedef s_u16_t m_fetion_t; +typedef s_u32_t m_group_t; +typedef s_u16_t m_stacksize_t; +typedef s_u16_t m_stacklen_t; +#if (SYSCFG_SYSTICK_CYCLE > 1000000UL / 65536) +typedef s_u16_t m_rtccount_t; +#else +typedef s_u32_t m_rtccount_t; +#endif + + +/* Extern */ +extern bit m_sign_fifo_0_0; +extern s_u8_t mPendSV_FIFO_DepthMAX; +extern void mx_disable_irq(void); +extern void mx_resume_irq (void); +extern void mPendSV_FIFOHandler(void); +#pragma SAVE +#pragma functions(static) +extern void mPendSV_FIFOLoader (void _STATIC_MEM_ *sv); +#pragma RESTORE + + +/* CMSIS */ +#ifndef __WEAK +#define __WEAK +#endif +#ifndef __NOP +#define __NOP _nop_ +#endif +#ifndef __STATIC_FORCEINLINE +#define __STATIC_FORCEINLINE static +#endif +#ifndef __NOINLINE +#define __NOINLINE +#endif +#define __UNUSED(X) void *p_##X = (void *)X + + +/* CONST & ATTRIBUTE */ +#define MCUCFG_ISA __MCS_251__ +#define MCUCFG_PCLEN 4 +#define MCUCFG_TASK_ATTRIBUTE +#define MCUCFG_OSIT_ATTRIBUTE +#define MCUCFG_SYSTICK_ATTRIBUTE interrupt 1 +#define MCUCFG_TERNARYMASK + +#define MCUCFG_STACK_ALIGN +/** \PUSH {4 Byte Interrupt Frame,DR28-DR0,DR56,PSW1,PSW,[USERREG(ASM)]} */ +#define MCUCFG_BASICSTACKSIZE (42 + MCUCFG_USERREGSIZE) + + +/* TaskNode */ +#define mTaskNode_Tail_ mUserReg_DEFc_ + + +/* SysTick */ +#define MCUCFG_SYSTICK_COUNTMODE 3 /*!< 计数方式,3:从重装载值向上计数至零溢出 */ +#define MCUCFG_SYSTICK_LIMITVALUE (1UL << 16) /*!< 极限值 */ +#define MCUCFG_SYSTICK_CURRVALUE ((TH0 << 8) | TL0) /*!< 当前值寄存器 */ +#define MCUCFG_SYSTICK_CLKDIV ((MCUCFG_SYSCLKHZ / 1000UL * SYSCFG_SYSTICK_CYCLE <= MCUCFG_SYSTICK_MAXVALUE * 1000UL) ? 1 : 12) +#define MCUCFG_SYSTICK_COUNT1CYC ((MCUCFG_SYSCLKHZ / 1000UL * SYSCFG_SYSTICK_CYCLE) / MCUCFG_SYSTICK_CLKDIV / 1000UL) +#define MCUCFG_SYSTICK_LOADVALUE (MCUCFG_SYSTICK_LIMITVALUE - MCUCFG_SYSTICK_COUNT1CYC) +#define MCUCFG_SYSTICK_MAXVALUE MCUCFG_SYSTICK_LIMITVALUE +#define MCUCFG_SYSTICK_MINVALUE MCUCFG_SYSTICK_LOADVALUE +#if (MCUCFG_SYSTICK_COUNT1CYC > (MCUCFG_SYSTICK_LIMITVALUE - 1)) +#error 系统滴答定时器溢出。 +#endif +#define mSysTick_INIT() \ +do{ \ + AUXR = MCUCFG_SYSTICK_CLKDIV == 1 ? AUXR | 0x80 : AUXR &~0x80; \ + TMOD &= 0xF0; \ + TL0 = (s_u8_t)(MCUCFG_SYSTICK_LOADVALUE); \ + TH0 = (s_u8_t)(MCUCFG_SYSTICK_LOADVALUE >> 8); \ + TR0 = 1; \ +}while(false) +#define mSysTick_Disable() ET0 = 0 +#define mSysTick_Enable() ET0 = 1 +#define mSysTick_Clear() + + +/* 内核锁 */ +#define mSysIRQ_Disable() \ +do{ \ + mPendSV_Disable(); \ + mSysTick_Disable(); \ +}while(false) + +#define mSysIRQ_Enable() \ +do{ \ + mSysTick_Enable(); \ + mPendSV_Enable(); \ +}while(false) + + +/* CosyOS初始化 */ +#define mCosyOS_INIT() \ +do{ \ + s_init_mempool((void _MALLOC_MEM_ *)MCUCFG_MALLOCMEMBPTR, MCUCFG_MALLOCMEMSIZE); \ + OS_NOP(1); \ + mSysTick_INIT(); \ + mSysIRQ_Enable(); \ + EA = 1; \ +}while(false) + + +/* CosyOS低功耗 */ +#define mCosyOS_IDLE() \ +do{ \ + PCON |= 0x01; \ + OS_NOP(4); \ +}while(false) + + +/* 中断挂起服务_FIFO */ +#define mPendSV_FIFOLoad() \ +do{ \ + mPendSV_FIFOLoader(&u_psv); \ + mPendSV_Set(); \ +}while(false) + +#define mPendSV_FIFOHandle() \ + if(!m_sign_fifo_0_0) mPendSV_FIFOHandler() + + +/* 事件标志组-中断中写多标志位 */ +#define miWriteFlagBits() \ + if(!u_psv.value){ \ + do{}while(false) + + +/* 任务栈 */ +#define mTaskStack_INIT0() \ +do{ \ + *(s_u32_t *)node_news->bsp = ( \ + ((s_u16_t)s_task_starter->entry << 8) \ + | ((s_u16_t)s_task_starter->entry >> 8) \ + | ((s_u32_t)s_task_starter->entry & 0xFFFF0000) \ + ); \ + *(s_u8_t *)(node_news->bsp + 42 - 5) = DPXL; \ + *(s_u8_t *)(node_news->bsp + 42 - 1) = 0; \ + mUserReg_INITa(); \ + mUserReg_INITc(); \ +}while(false) + +#define mTaskStack_LEN() + + +/* MSP模式 */ +#if (MCUCFG_TASKSTACK_MODE == __MSP__) +#define MCUCFG_TASKSTACK_REALLOC __ENABLED__ +#define mTaskNode_Head_ m_stacksize_t stacklen; +#define mTaskStack_INIT() \ +do{ \ + mTaskStack_INIT0(); \ + node_news->stacklen = MCUCFG_BASICSTACKSIZE; \ +}while(false) + + +/* PSP模式 */ +#elif (MCUCFG_TASKSTACK_MODE == __PSP__) +#define MCUCFG_TASKSTACK_REALLOC __DISABLED__ +#define mTaskNode_Head_ m_sp_t psp; +#define mTaskStack_INIT() \ +do{ \ + mTaskStack_INIT0(); \ + node_news->psp = (m_sp_t)node_news->bsp + MCUCFG_BASICSTACKSIZE - 1; \ +}while(false) +#endif + + +/* 全局临界区 */ +#define mxDisableIRQ() mx_disable_irq() +#define mxResumeIRQ() mx_resume_irq() + + +#endif diff --git a/Port/80251/port_80251s.s b/Port/80251/port_80251s.s new file mode 100644 index 0000000..4d6c83b --- /dev/null +++ b/Port/80251/port_80251s.s @@ -0,0 +1,683 @@ +;******************************************************************************* +;* @item CosyOS-III Port +;* @file port_80251s.s +;* @brief 80251 Core Port File +;* @author 迟凯峰 +;* @version V2.2.0 +;* @date 2026.01.13 +;******************************************************************************* +; +$INCLUDE (syscfg.h) +IF SYSCFG_MCUCORE == 80251 +$INCLUDE (mcucfg_80251.h) +$INCLUDE (mcucfg_80251.inc) +; +;/////////////////////////////////////////////////////////////////////////////// +; +; 用户定义寄存器 +; +; 1、mcucfg_80251.h -> PendSV中断配置 -> 中断清零,涉及的寄存器; +; 2、用户自定义任务切换现场保护,汇编语言保护方案,涉及的寄存器; +; +; 通常,直接包含标准头文件(h、inc)即可。 +; 如果包含h文件导致编译报错,说明h文件中存在汇编器不能识别的C语言语法, +; 您可包含inc文件或重写新的h文件,也可在此处直接定义相关寄存器。 +; +TCON DATA 088H +IE0 BIT TCON^1 +; +;/////////////////////////////////////////////////////////////////////////////// + + NAME PORT_80251S + +;/////////////////////////////////////////////////////////////////////////////// + +$IF ROMHUGE ; Code Rom Size: Huge +Prefix LIT '?' +PRSeg LIT 'ECODE' +PRJmp LIT 'EJMP' +PRCall LIT 'ECALL' +PRRet LIT 'ERET' +$ELSE ; Code Rom Size: Large +Prefix LIT '' +PRSeg LIT 'CODE' +PRJmp LIT 'LJMP' +PRCall LIT 'LCALL' +PRRet LIT 'RET' +$ENDIF + +DPL DATA 082H +DPH DATA 083H +DPXL DATA 084H +PSW DATA 0D0H +PSW1 DATA 0D1H + +; OS_PendSV_Handler +; PendSV中断服务函数 + +?PR?OS_PendSV_Handler{Prefix}?PORT_80251S SEGMENT PRSeg +?STACK SEGMENT EDATA + EXTRN PRSeg(sPendSV_Handler{Prefix}) + EXTRN DATA (s_task_current) + EXTRN DATA (s_task_news) + EXTRN DATA (m_bsp_add) + IF SYSCFG_DEBUGGING == 1 + EXTRN BIT (s_taskmgr_sign) + EXTRN DATA (s_taskstacklen) + ENDIF + IF SYSCFG_TASKPC_MONITOR == 1 + EXTRN DATA (s_pc) + ENDIF + + CSEG AT MCUCFG_PENDSV_VECTORADDR + PRJmp OS_PendSV_Handler{Prefix} + + RSEG ?PR?OS_PendSV_Handler{Prefix}?PORT_80251S +OS_PendSV_Handler{Prefix}: + + PUSH DR28 + PUSH DR24 + PUSH DR20 + PUSH DR16 + PUSH DR12 + PUSH DR8 + PUSH DR4 + PUSH DR0 + PUSH DR56 + PUSH PSW1 + PUSH PSW + + mPendSV_Clear + ; 任务栈长 +IF SYSCFG_DEBUGGING == 1 + CLR C + MOV DR8, DR60 + IF MCUCFG_TASKSTACK_MODE == __MSP__ + SUB WR10, #WORD0 (?STACK-1) + ELSE + MOV WR6, s_task_current + ADD WR6, m_bsp_add + MOV WR4, @WR6 + DEC WR4, #1 + SUB WR10, WR4 + ENDIF + IF MCUCFG_USERREGSIZE + ADD WR10, #MCUCFG_USERREGSIZE + ENDIF + MOV s_taskstacklen, WR10 +ENDIF + PRCall sPendSV_Handler{Prefix} + + CLR C + JNZ ?PROTECTING + LJMP RETURN +?PROTECTING: DEC A + JNZ TASKPC + LJMP RESTORE + +TASKPC: ; 任务PC +IF SYSCFG_TASKPC_MONITOR == 1 + JNB s_taskmgr_sign, PROTECTING + MOV DR8, DR60 + SUB WR10, #42-1 + MOV WR4, @WR10 + MOV R7, @WR10+2 + MOV R6, @WR10+3 + MOV R4, #0 + MOV s_pc, DR4 +ENDIF + +PROTECTING: ; 保护现场 +IF MCUCFG_USERREGSIZE + mUserReg_PUSH +ENDIF + + MOV DR8, DR60 +IF MCUCFG_MEMORYMODEL == 0 ; 方案一 + MOV WR6, s_task_current + MOV @WR6, WR10 +ELSE + MOV WR8, #0 + SUB WR10, #WORD0 (?STACK-1) + MOV WR2, WR10 + SRL WR2 + SRL WR2 + IF MCUCFG_MEMORYMODEL == 1 ; 方案二 + ?REG LIT 'WR6' + MOV WR6, s_task_current + MOV @WR6, WR10 + ADD WR6, m_bsp_add + MOV WR6, @WR6 + ADD WR6, WR10 + ANL WR10, #3 + JZ SAVESTACK + INC WR2, #1 + INC DR60, #4 + SUB DR60, DR8 + INC WR6, #4 + SUB WR6, WR10 + ELSEIF MCUCFG_MEMORYMODEL == 2 || MCUCFG_MEMORYMODEL == 3 ; 方案三 & 方案四 + ?REG LIT 'DR28' + MOV DR4, s_task_current + MOV @DR4, WR10 + MOV WR12, #0 + MOV WR14, m_bsp_add + ADD DR4, DR12 + MOV WR28, @DR4 + MOV WR30, @DR4+2 + ADD DR28, DR8 + ANL WR10, #3 + JZ SAVESTACK + INC WR2, #1 + INC DR60, #4 + SUB DR60, DR8 + INC DR28, #4 + SUB DR28, DR8 + ELSEIF MCUCFG_MEMORYMODEL == 4 ; 方案五 + ?REG LIT 'DR4' + MOV R4, #0 + MOV R5, DPXL + MOV WR6, s_task_current + MOV @DR4, WR10 + ADD WR6, m_bsp_add + MOV WR6, @DR4 + ADD WR6, WR10 + ANL WR10, #3 + JZ SAVESTACK + INC WR2, #1 + INC DR60, #4 + SUB DR60, DR8 + INC WR6, #4 + SUB WR6, WR10 + ENDIF + +SAVESTACK: + IF MCUCFG_TASKSWITCHMODE == 1 + POP DR12 + MOV @?REG-1*4+0, WR12 + MOV @?REG-1*4+2, WR14 + POP DR12 + MOV @?REG-2*4+0, WR12 + MOV @?REG-2*4+2, WR14 + POP DR12 + MOV @?REG-3*4+0, WR12 + MOV @?REG-3*4+2, WR14 + POP DR12 + MOV @?REG-4*4+0, WR12 + MOV @?REG-4*4+2, WR14 + POP DR12 + MOV @?REG-5*4+0, WR12 + MOV @?REG-5*4+2, WR14 + POP DR12 + MOV @?REG-6*4+0, WR12 + MOV @?REG-6*4+2, WR14 + POP DR12 + MOV @?REG-7*4+0, WR12 + MOV @?REG-7*4+2, WR14 + POP DR12 + MOV @?REG-8*4+0, WR12 + MOV @?REG-8*4+2, WR14 + POP DR12 + MOV @?REG-9*4+0, WR12 + MOV @?REG-9*4+2, WR14 + POP DR12 + MOV @?REG-10*4+0, WR12 + MOV @?REG-10*4+2, WR14 + SUB ?REG, #10*4 + SUB WR2, #10 + ENDIF +SAVELOOP: POP DR12 + DEC ?REG, #4 + MOV @?REG+0, WR12 + MOV @?REG+2, WR14 + DEC WR2, #1 + JNE SAVELOOP +ENDIF + +RESTORE: ; 恢复现场 +IF MCUCFG_MEMORYMODEL == 0 ; 方案一 + MOV WR6, s_task_news + MOV s_task_current, WR6 + MOV WR10, @WR6 + MOV DR60, DR8 +ELSE + MOV DR60, #WORD0 (?STACK-1) + IF MCUCFG_MEMORYMODEL == 1 ; 方案二 + MOV WR6, s_task_news + MOV s_task_current, WR6 + MOV WR10, @WR6 + ADD WR6, m_bsp_add + MOV WR6, @WR6 + ELSEIF MCUCFG_MEMORYMODEL == 2 || MCUCFG_MEMORYMODEL == 3 ; 方案三 & 方案四 + MOV DR4, s_task_news + MOV s_task_current, DR4 + MOV WR10, @DR4 + MOV WR12, #0 + MOV WR14, m_bsp_add + ADD DR4, DR12 + MOV WR28, @DR4 + MOV WR30, @DR4+2 + ELSEIF MCUCFG_MEMORYMODEL == 4 ; 方案五 + MOV R4, #0 + MOV R5, DPXL + MOV WR6, s_task_news + MOV s_task_current, WR6 + MOV WR10, @DR4 + ADD WR6, m_bsp_add + MOV WR6, @DR4 + ENDIF + MOV WR2, WR10 + SRL WR2 + SRL WR2 + ANL WR10, #3 + JZ RESTORESTACK + INC WR2, #1 + +RESTORESTACK: + IF MCUCFG_TASKSWITCHMODE == 1 + MOV WR12, @?REG+0*4+0 + MOV WR14, @?REG+0*4+2 + PUSH DR12 + MOV WR12, @?REG+1*4+0 + MOV WR14, @?REG+1*4+2 + PUSH DR12 + MOV WR12, @?REG+2*4+0 + MOV WR14, @?REG+2*4+2 + PUSH DR12 + MOV WR12, @?REG+3*4+0 + MOV WR14, @?REG+3*4+2 + PUSH DR12 + MOV WR12, @?REG+4*4+0 + MOV WR14, @?REG+4*4+2 + PUSH DR12 + MOV WR12, @?REG+5*4+0 + MOV WR14, @?REG+5*4+2 + PUSH DR12 + MOV WR12, @?REG+6*4+0 + MOV WR14, @?REG+6*4+2 + PUSH DR12 + MOV WR12, @?REG+7*4+0 + MOV WR14, @?REG+7*4+2 + PUSH DR12 + MOV WR12, @?REG+8*4+0 + MOV WR14, @?REG+8*4+2 + PUSH DR12 + MOV WR12, @?REG+9*4+0 + MOV WR14, @?REG+9*4+2 + PUSH DR12 + ADD ?REG, #10*4 + SUB WR2, #10 + ENDIF +RESTORELOOP: MOV WR12, @?REG+0 + MOV WR14, @?REG+2 + PUSH DR12 + INC ?REG, #4 + DEC WR2, #1 + JNE RESTORELOOP + + JZ USERREGPOP + MOV WR8, #0 + DEC DR60, #4 + ADD DR60, DR8 +ENDIF + +USERREGPOP: +IF MCUCFG_USERREGSIZE + mUserReg_POP +ENDIF + +RETURN: POP PSW + POP PSW1 + POP DR56 + POP DR0 + POP DR4 + POP DR8 + POP DR12 + POP DR16 + POP DR20 + POP DR24 + POP DR28 + + RETI + +;/////////////////////////////////////////////////////////////////////////////// + +; 中断FIFO服务 + +IF MCUCFG_PENDSVFIFO_DEPTH > 0 + +; 中断FIFO服务-抢占队列项 + +?PR?mPendSV_FIFOPreempt{Prefix}?PORT_80251S SEGMENT PRSeg + EXTRN BIT (m_sign_fifo) + EXTRN DATA (m_fifo_0_count) + EXTRN DATA (m_fifo_1_count) + + EXTRN BIT (m_sign_fifo_0_0) + EXTRN BIT (m_sign_fifo_0_1) + EXTRN BIT (m_sign_fifo_0_2) + EXTRN BIT (m_sign_fifo_0_3) + EXTRN BIT (m_sign_fifo_0_4) + EXTRN BIT (m_sign_fifo_0_5) + EXTRN BIT (m_sign_fifo_0_6) + EXTRN BIT (m_sign_fifo_0_7) + EXTRN BIT (m_sign_fifo_1_0) + EXTRN BIT (m_sign_fifo_1_1) + EXTRN BIT (m_sign_fifo_1_2) + EXTRN BIT (m_sign_fifo_1_3) + EXTRN BIT (m_sign_fifo_1_4) + EXTRN BIT (m_sign_fifo_1_5) + EXTRN BIT (m_sign_fifo_1_6) + EXTRN BIT (m_sign_fifo_1_7) +IF MCUCFG_PENDSVFIFO_DEPTH > 8 + EXTRN BIT (m_sign_fifo_0_8) + EXTRN BIT (m_sign_fifo_0_9) + EXTRN BIT (m_sign_fifo_0_10) + EXTRN BIT (m_sign_fifo_0_11) + EXTRN BIT (m_sign_fifo_0_12) + EXTRN BIT (m_sign_fifo_0_13) + EXTRN BIT (m_sign_fifo_0_14) + EXTRN BIT (m_sign_fifo_0_15) + EXTRN BIT (m_sign_fifo_1_8) + EXTRN BIT (m_sign_fifo_1_9) + EXTRN BIT (m_sign_fifo_1_10) + EXTRN BIT (m_sign_fifo_1_11) + EXTRN BIT (m_sign_fifo_1_12) + EXTRN BIT (m_sign_fifo_1_13) + EXTRN BIT (m_sign_fifo_1_14) + EXTRN BIT (m_sign_fifo_1_15) +IF MCUCFG_PENDSVFIFO_DEPTH > 16 + EXTRN BIT (m_sign_fifo_0_16) + EXTRN BIT (m_sign_fifo_0_17) + EXTRN BIT (m_sign_fifo_0_18) + EXTRN BIT (m_sign_fifo_0_19) + EXTRN BIT (m_sign_fifo_0_20) + EXTRN BIT (m_sign_fifo_0_21) + EXTRN BIT (m_sign_fifo_0_22) + EXTRN BIT (m_sign_fifo_0_23) + EXTRN BIT (m_sign_fifo_1_16) + EXTRN BIT (m_sign_fifo_1_17) + EXTRN BIT (m_sign_fifo_1_18) + EXTRN BIT (m_sign_fifo_1_19) + EXTRN BIT (m_sign_fifo_1_20) + EXTRN BIT (m_sign_fifo_1_21) + EXTRN BIT (m_sign_fifo_1_22) + EXTRN BIT (m_sign_fifo_1_23) +IF MCUCFG_PENDSVFIFO_DEPTH > 24 + EXTRN BIT (m_sign_fifo_0_24) + EXTRN BIT (m_sign_fifo_0_25) + EXTRN BIT (m_sign_fifo_0_26) + EXTRN BIT (m_sign_fifo_0_27) + EXTRN BIT (m_sign_fifo_0_28) + EXTRN BIT (m_sign_fifo_0_29) + EXTRN BIT (m_sign_fifo_0_30) + EXTRN BIT (m_sign_fifo_0_31) + EXTRN BIT (m_sign_fifo_1_24) + EXTRN BIT (m_sign_fifo_1_25) + EXTRN BIT (m_sign_fifo_1_26) + EXTRN BIT (m_sign_fifo_1_27) + EXTRN BIT (m_sign_fifo_1_28) + EXTRN BIT (m_sign_fifo_1_29) + EXTRN BIT (m_sign_fifo_1_30) + EXTRN BIT (m_sign_fifo_1_31) +IF MCUCFG_PENDSVFIFO_DEPTH > 32 + EXTRN BIT (m_sign_fifo_0_32) + EXTRN BIT (m_sign_fifo_0_33) + EXTRN BIT (m_sign_fifo_0_34) + EXTRN BIT (m_sign_fifo_0_35) + EXTRN BIT (m_sign_fifo_0_36) + EXTRN BIT (m_sign_fifo_0_37) + EXTRN BIT (m_sign_fifo_0_38) + EXTRN BIT (m_sign_fifo_0_39) + EXTRN BIT (m_sign_fifo_1_32) + EXTRN BIT (m_sign_fifo_1_33) + EXTRN BIT (m_sign_fifo_1_34) + EXTRN BIT (m_sign_fifo_1_35) + EXTRN BIT (m_sign_fifo_1_36) + EXTRN BIT (m_sign_fifo_1_37) + EXTRN BIT (m_sign_fifo_1_38) + EXTRN BIT (m_sign_fifo_1_39) +ENDIF +ENDIF +ENDIF +ENDIF + + RSEG ?PR?mPendSV_FIFOPreempt{Prefix}?PORT_80251S +mPendSV_FIFOPreempt{Prefix}: + +IF MCUCFG_MEMORYMODEL <= 2 + MOV DR0, #0x0100 +ELSE + MOV R0, #0 + MOV DPTR, #0x0100 +ENDIF + JB m_sign_fifo, FIFO_0 +IF MCUCFG_MEMORYMODEL <= 2 + INC R2 +ELSE + INC DPH +ENDIF + LJMP FIFO_1 + +FIFO_0: JBC m_sign_fifo_0_0, FIFO_X_0 + JBC m_sign_fifo_0_1, FIFO_X_1 + JBC m_sign_fifo_0_2, FIFO_X_2 + JBC m_sign_fifo_0_3, FIFO_X_3 + JBC m_sign_fifo_0_4, FIFO_X_4 + JBC m_sign_fifo_0_5, FIFO_X_5 + JBC m_sign_fifo_0_6, FIFO_X_6 + JBC m_sign_fifo_0_7, FIFO_X_7 +IF MCUCFG_PENDSVFIFO_DEPTH > 8 + JBC m_sign_fifo_0_8, FIFO_X_8 + JBC m_sign_fifo_0_9, FIFO_X_9 + JBC m_sign_fifo_0_10, FIFO_X_10 + JBC m_sign_fifo_0_11, FIFO_X_11 + JBC m_sign_fifo_0_12, FIFO_X_12 + JBC m_sign_fifo_0_13, FIFO_X_13 + JBC m_sign_fifo_0_14, FIFO_X_14 + JBC m_sign_fifo_0_15, FIFO_X_15 +IF MCUCFG_PENDSVFIFO_DEPTH > 16 + JBC m_sign_fifo_0_16, FIFO_X_16 + JBC m_sign_fifo_0_17, FIFO_X_17 + JBC m_sign_fifo_0_18, FIFO_X_18 + JBC m_sign_fifo_0_19, FIFO_X_19 + JBC m_sign_fifo_0_20, FIFO_X_20 + JBC m_sign_fifo_0_21, FIFO_X_21 + JBC m_sign_fifo_0_22, FIFO_X_22 + JBC m_sign_fifo_0_23, FIFO_X_23 +IF MCUCFG_PENDSVFIFO_DEPTH > 24 + JBC m_sign_fifo_0_24, FIFO_X_24 + JBC m_sign_fifo_0_25, FIFO_X_25 + JBC m_sign_fifo_0_26, FIFO_X_26 + JBC m_sign_fifo_0_27, FIFO_X_27 + JBC m_sign_fifo_0_28, FIFO_X_28 + JBC m_sign_fifo_0_29, FIFO_X_29 + JBC m_sign_fifo_0_30, FIFO_X_30 + JBC m_sign_fifo_0_31, FIFO_X_31 +IF MCUCFG_PENDSVFIFO_DEPTH > 32 + JBC m_sign_fifo_0_32, FIFO_X_32 + JBC m_sign_fifo_0_33, FIFO_X_33 + JBC m_sign_fifo_0_34, FIFO_X_34 + JBC m_sign_fifo_0_35, FIFO_X_35 + JBC m_sign_fifo_0_36, FIFO_X_36 + JBC m_sign_fifo_0_37, FIFO_X_37 + JBC m_sign_fifo_0_38, FIFO_X_38 + JBC m_sign_fifo_0_39, FIFO_X_39 +ENDIF +ENDIF +ENDIF +ENDIF + INC m_fifo_0_count + INC R0 + PRRet + +FIFO_X_0: MOV A, #0*2 + PRRet +FIFO_X_1: MOV A, #1*2 + PRRet +FIFO_X_2: MOV A, #2*2 + PRRet +FIFO_X_3: MOV A, #3*2 + PRRet +FIFO_X_4: MOV A, #4*2 + PRRet +FIFO_X_5: MOV A, #5*2 + PRRet +FIFO_X_6: MOV A, #6*2 + PRRet +FIFO_X_7: MOV A, #7*2 + PRRet +IF MCUCFG_PENDSVFIFO_DEPTH > 8 +FIFO_X_8: MOV A, #8*2 + PRRet +FIFO_X_9: MOV A, #9*2 + PRRet +FIFO_X_10: MOV A, #10*2 + PRRet +FIFO_X_11: MOV A, #11*2 + PRRet +FIFO_X_12: MOV A, #12*2 + PRRet +FIFO_X_13: MOV A, #13*2 + PRRet +FIFO_X_14: MOV A, #14*2 + PRRet +FIFO_X_15: MOV A, #15*2 + PRRet +IF MCUCFG_PENDSVFIFO_DEPTH > 16 +FIFO_X_16: MOV A, #16*2 + PRRet +FIFO_X_17: MOV A, #17*2 + PRRet +FIFO_X_18: MOV A, #18*2 + PRRet +FIFO_X_19: MOV A, #19*2 + PRRet +FIFO_X_20: MOV A, #20*2 + PRRet +FIFO_X_21: MOV A, #21*2 + PRRet +FIFO_X_22: MOV A, #22*2 + PRRet +FIFO_X_23: MOV A, #23*2 + PRRet +IF MCUCFG_PENDSVFIFO_DEPTH > 24 +FIFO_X_24: MOV A, #24*2 + PRRet +FIFO_X_25: MOV A, #25*2 + PRRet +FIFO_X_26: MOV A, #26*2 + PRRet +FIFO_X_27: MOV A, #27*2 + PRRet +FIFO_X_28: MOV A, #28*2 + PRRet +FIFO_X_29: MOV A, #29*2 + PRRet +FIFO_X_30: MOV A, #30*2 + PRRet +FIFO_X_31: MOV A, #31*2 + PRRet +IF MCUCFG_PENDSVFIFO_DEPTH > 32 +FIFO_X_32: MOV A, #32*2 + PRRet +FIFO_X_33: MOV A, #33*2 + PRRet +FIFO_X_34: MOV A, #34*2 + PRRet +FIFO_X_35: MOV A, #35*2 + PRRet +FIFO_X_36: MOV A, #36*2 + PRRet +FIFO_X_37: MOV A, #37*2 + PRRet +FIFO_X_38: MOV A, #38*2 + PRRet +FIFO_X_39: MOV A, #39*2 + PRRet +ENDIF +ENDIF +ENDIF +ENDIF + +FIFO_1: JBC m_sign_fifo_1_0, FIFO_X_0 + JBC m_sign_fifo_1_1, FIFO_X_1 + JBC m_sign_fifo_1_2, FIFO_X_2 + JBC m_sign_fifo_1_3, FIFO_X_3 + JBC m_sign_fifo_1_4, FIFO_X_4 + JBC m_sign_fifo_1_5, FIFO_X_5 + JBC m_sign_fifo_1_6, FIFO_X_6 + JBC m_sign_fifo_1_7, FIFO_X_7 +IF MCUCFG_PENDSVFIFO_DEPTH > 8 + JBC m_sign_fifo_1_8, FIFO_X_8 + JBC m_sign_fifo_1_9, FIFO_X_9 + JBC m_sign_fifo_1_10, FIFO_X_10 + JBC m_sign_fifo_1_11, FIFO_X_11 + JBC m_sign_fifo_1_12, FIFO_X_12 + JBC m_sign_fifo_1_13, FIFO_X_13 + JBC m_sign_fifo_1_14, FIFO_X_14 + JBC m_sign_fifo_1_15, FIFO_X_15 +IF MCUCFG_PENDSVFIFO_DEPTH > 16 + JBC m_sign_fifo_1_16, FIFO_X_16 + JBC m_sign_fifo_1_17, FIFO_X_17 + JBC m_sign_fifo_1_18, FIFO_X_18 + JBC m_sign_fifo_1_19, FIFO_X_19 + JBC m_sign_fifo_1_20, FIFO_X_20 + JBC m_sign_fifo_1_21, FIFO_X_21 + JBC m_sign_fifo_1_22, FIFO_X_22 + JBC m_sign_fifo_1_23, FIFO_X_23 +IF MCUCFG_PENDSVFIFO_DEPTH > 24 + JBC m_sign_fifo_1_24, FIFO_X_24 + JBC m_sign_fifo_1_25, FIFO_X_25 + JBC m_sign_fifo_1_26, FIFO_X_26 + JBC m_sign_fifo_1_27, FIFO_X_27 + JBC m_sign_fifo_1_28, FIFO_X_28 + JBC m_sign_fifo_1_29, FIFO_X_29 + JBC m_sign_fifo_1_30, FIFO_X_30 + JBC m_sign_fifo_1_31, FIFO_X_31 +IF MCUCFG_PENDSVFIFO_DEPTH > 32 + JBC m_sign_fifo_1_32, FIFO_X_32 + JBC m_sign_fifo_1_33, FIFO_X_33 + JBC m_sign_fifo_1_34, FIFO_X_34 + JBC m_sign_fifo_1_35, FIFO_X_35 + JBC m_sign_fifo_1_36, FIFO_X_36 + JBC m_sign_fifo_1_37, FIFO_X_37 + JBC m_sign_fifo_1_38, FIFO_X_38 + JBC m_sign_fifo_1_39, FIFO_X_39 +ENDIF +ENDIF +ENDIF +ENDIF + INC m_fifo_1_count + INC R0 + PRRet + + +; 中断FIFO服务装载器 + +?PR?mPendSV_FIFOLoader{Prefix}?PORT_80251S SEGMENT PRSeg + PUBLIC mPendSV_FIFOLoader{Prefix} + RSEG ?PR?mPendSV_FIFOLoader{Prefix}?PORT_80251S +mPendSV_FIFOLoader{Prefix}: + + PRCall mPendSV_FIFOPreempt{Prefix} +IF MCUCFG_MEMORYMODEL <= 2 + MOV R3, A +ELSE + MOV DPL, A +ENDIF + MOV A, R0 + JNZ FAILED +IF MCUCFG_MEMORYMODEL <= 2 + MOV @WR2, WR6 +ELSE + MOV @DR56, WR6 +ENDIF +FAILED: PRRet + +ENDIF + +;/////////////////////////////////////////////////////////////////////////////// + +ENDIF + END