From 564dfb4d01e9134002b689d53a8cd20135cb0452 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9B=B6=E4=B8=AD=E6=96=AD=E5=BB=B6=E8=BF=9F=E7=9A=84RTOS?= Date: Tue, 13 Jan 2026 09:26:54 +0000 Subject: [PATCH] =?UTF-8?q?update=20=E7=A7=BB=E6=A4=8D=E6=96=87=E4=BB=B6.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 零中断延迟的RTOS --- Port/8051/port_8051.c | 295 +++++++++++++++++++ Port/8051/port_8051.h | 235 +++++++++++++++ Port/8051/port_8051s.s | 630 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 1160 insertions(+) create mode 100644 Port/8051/port_8051.c create mode 100644 Port/8051/port_8051.h create mode 100644 Port/8051/port_8051s.s diff --git a/Port/8051/port_8051.c b/Port/8051/port_8051.c new file mode 100644 index 0000000..97fb51a --- /dev/null +++ b/Port/8051/port_8051.c @@ -0,0 +1,295 @@ +/**************************************************************************//** + * @item CosyOS-III Port + * @file port_8051.c + * @brief 8051 Core Port File + * @author 迟凯峰 + * @version V2.2.0 + * @date 2026.01.13 + ******************************************************************************/ + +#include "os_var.h" +#ifdef __PORT_8051_H + +s_u8_t _SYS_MEM_ m_bsp_add = sizeof(s_taskhand_ts); +#if (MCUCFG_PENDSVFIFO_DEPTH <= 0) +static s_u8_t xdata mVOID _at_ 0; +#endif + + +/* + * 全局临界区 + */ + +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 s_u16_t mPendSV_FIFO_0[MCUCFG_PENDSVFIFO_DEPTH + MCUCFG_PENDSVFIFO_MUTEX - 1] _at_ 0x0000; +static s_u16_t mPendSV_FIFO_1[MCUCFG_PENDSVFIFO_DEPTH + MCUCFG_PENDSVFIFO_MUTEX - 1] _at_ 0x0100; +static void _fifo_x_(void _STATIC_MEM_ *sv) MCUCFG_OSIT_ATTRIBUTE +{ + (*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) MCUCFG_OSIT_ATTRIBUTE +{ + #if (SYSCFG_PENDSVFIFO_MONITOR == __ENABLED__) + s_u8_t _SYS_MEM_ 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/8051/port_8051.h b/Port/8051/port_8051.h new file mode 100644 index 0000000..381c087 --- /dev/null +++ b/Port/8051/port_8051.h @@ -0,0 +1,235 @@ +/**************************************************************************//** + * @item CosyOS-III Port + * @file port_8051.h + * @brief 8051 Core Port File + * @author 迟凯峰 + * @version V2.2.0 + * @date 2026.01.13 + ******************************************************************************/ + +#ifndef __PORT_8051_H +#define __PORT_8051_H + +/* INCLUDE */ +#include +#include "os_base.h" +#include "os_def.h" +#include "syscfg.h" +#include "mcucfg_8051.h" +#include SYSCFG_STANDARDHEAD + + +/* Memory */ +#define _SYS_MEM_ data +#define _CODE_MEM_ code +#define _CONST_MEM_ code +#define _STACK_MEM_ idata +#define _XDATA_MEM_ xdata +#define _STATIC_MEM_ xdata +#ifndef _MALLOC_MEM_ +#define _MALLOC_MEM_ xdata +#endif +#define _OBJ_MEM_ xdata +/* + * 用户自定义内存 + * 用户可自定义下方的内存,以寻求在性能和资源之间取得平衡。默认为未定义,由内存MODEL决定。 + * 在 os_var.c、os_var.h 中,用户也可逐个查看及调整对应定义内存的变量,以实现极致的优化。 + */ +#define _RTC_MEM_ /* 软件RTC相关系统变量的内存 */ +#define _DEBUG_MEM_ /* DEBUG相关系统变量的内存 */ + + +/* Register */ +#define _SYS_REG_ _SYS_MEM_ + + +/* Typedef */ +#define m_boolvoid_tf (s_boolvoid_tf) +#ifndef bool +typedef s_u8_t bool; +#endif +typedef bit m_bit_t; +typedef s_u8_t m_sp_t; +typedef s_u16_t m_tick_t; +typedef s_u16_t m_pc_t; +typedef s_u8_t m_tqcount_t; +typedef s_u8_t m_fetion_t; +typedef s_u32_t m_group_t; +#if (MCUCFG_XBPSTACK == __ENABLED__) +typedef s_u16_t m_stacksize_t; +#else +typedef s_u8_t m_stacksize_t; +#endif +typedef s_u8_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_FIFOLoader (s_u16_t sv); +extern void mPendSV_FIFOHandler(void); + + +/* 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) X = X + + +/* CONST & ATTRIBUTE */ +#define MCUCFG_ISA __MCS_51__ +#define MCUCFG_PCLEN 2 +#if (MCUCFG_TASK_VECTOR) +#define MCUCFG_TASK_ATTRIBUTE interrupt MCUCFG_TASK_VECTOR using MCUCFG_TASK_REGBANK +#else +#define MCUCFG_TASK_ATTRIBUTE +#endif +#if (MCUCFG_TASK_REGBANK != MCUCFG_OSIT_REGBANK) +#define MCUCFG_OSIT_ATTRIBUTE using MCUCFG_OSIT_REGBANK +#else +#define MCUCFG_OSIT_ATTRIBUTE +#endif +#define MCUCFG_SYSTICK_ATTRIBUTE interrupt 1 MCUCFG_OSIT_ATTRIBUTE +#define MCUCFG_TERNARYMASK false; + +#define MCUCFG_STACK_ALIGN +#define MCUCFG_TASKSTACK_REALLOC __ENABLED__ +/** 1: \PUSH {PC,A,B,DPH,DPL,PSW}, \SAVE {TASK-REGBANK:R0-R7,[USERREG(ASM)],[?C_XBP]} */ +/** 2: \PUSH {PC,A,B,DPH,DPL,PSW,[USERREG(ASM)]}, \SAVE {TASK-REGBANK:R0-R7,[?C_XBP]} */ +/** 3: \PUSH {PC,A,B,DPH,DPL,PSW,TASK-REGBANK:R0-R7}, \SAVE {[USERREG(ASM)],[?C_XBP]} */ +/** 4: \PUSH {PC,A,B,DPH,DPL,PSW,TASK-REGBANK:R0-R7,[USERREG(ASM)]}, \SAVE {[?C_XBP]} */ +#define MCUCFG_BASICSTACKSIZE (15 + MCUCFG_USERREGSIZE + (MCUCFG_XBPSTACK == __ENABLED__ ? 2 : 0)) + + +/* TaskNode */ +#define mTaskNode_Head_ m_stacksize_t stacklen; +#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((s_u16_t)&u_psv); \ + mPendSV_Set(); \ +}while(false) + +#define mPendSV_FIFOHandle() \ + if(!m_sign_fifo_0_0) mPendSV_FIFOHandler() + + +/* 事件标志组-中断中写多标志位 */ +#define miWriteFlagBits() \ + static bit u_f = false; \ + if(!u_f){ \ + u_f = true + + +/* 任务栈 */ +#if (MCUCFG_XBPSTACK == __ENABLED__) +#define mXBP_INIT() \ + *(s_u16_t *)(node_news->bsp + 15 + MCUCFG_USERREGSIZE) \ + = node_news->bsp + node_news->stacksize +#else +#define mXBP_INIT() +#endif + +#define mTaskStack_INIT() \ +do{ \ + node_news->stacklen = ( \ + (MCUCFG_TASK_REGBANK == MCUCFG_OSIT_REGBANK ? 15 : 7) \ + + (MCUCFG_USERREGCONFIG == 1 ? MCUCFG_USERREGSIZE : 0) \ + ); \ + *(s_u16_t *)node_news->bsp = ( \ + ((s_u16_t)s_task_starter->entry << 8) \ + | ((s_u16_t)s_task_starter->entry >> 8) \ + ); \ + *(s_u8_t *)(node_news->bsp + 7 - 1) = MCUCFG_TASK_REGBANK * 8; \ + mUserReg_INITa(); \ + mXBP_INIT(); \ + mUserReg_INITc(); \ +}while(false) + +#define mTaskStack_LEN() + + +/* 全局临界区 */ +#define mxDisableIRQ() mx_disable_irq() +#define mxResumeIRQ() mx_resume_irq() + + +#endif diff --git a/Port/8051/port_8051s.s b/Port/8051/port_8051s.s new file mode 100644 index 0000000..756113f --- /dev/null +++ b/Port/8051/port_8051s.s @@ -0,0 +1,630 @@ +;******************************************************************************* +;* @item CosyOS-III Port +;* @file port_8051s.s +;* @brief 8051 Core Port File +;* @author 迟凯峰 +;* @version V2.2.0 +;* @date 2026.01.13 +;******************************************************************************* +; +$NOMOD51 +$INCLUDE (syscfg.h) +IF SYSCFG_MCUCORE == 8051 +$INCLUDE (mcucfg_8051.h) +$INCLUDE (mcucfg_8051.inc) +; +;/////////////////////////////////////////////////////////////////////////////// +; +; 用户定义 +; +; 包含头文件 或 直接定义寄存器,具体包括: +; 1、mcucfg_8051.h -> PendSV中断配置 -> 中断清零,涉及的寄存器; +; 2、用户自定义任务切换现场保护,汇编语言保护方案,涉及的寄存器; +; +; 通常,直接包含标准头文件(h、inc)即可。 +; 如果包含h文件导致编译报错,说明h文件中存在汇编器不能识别的C语言语法, +; 您可包含inc文件或重写新的h文件,也可在此处直接定义寄存器。 +; +#include SYSCFG_STANDARDHEAD +; +;/////////////////////////////////////////////////////////////////////////////// + + NAME PORT_8051S + +;/////////////////////////////////////////////////////////////////////////////// + +; OS_PendSV_Handler +; PendSV中断服务函数 + +?PR?OS_PendSV_Handler?PORT_8051S SEGMENT CODE +?STACK SEGMENT IDATA + EXTRN DATA (?C_XBP) + EXTRN CODE (sPendSV_Handler) + 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 + LJMP OS_PendSV_Handler + + RSEG ?PR?OS_PendSV_Handler?PORT_8051S + USING MCUCFG_TASK_REGBANK +OS_PendSV_Handler: + + PUSH ACC + PUSH B + PUSH DPH + PUSH DPL + PUSH PSW +IF MCUCFG_TASK_REGBANK <> MCUCFG_OSIT_REGBANK + MOV PSW, #MCUCFG_OSIT_REGBANK*8 +ELSE + PUSH AR0 + PUSH AR1 + PUSH AR2 + PUSH AR3 + PUSH AR4 + PUSH AR5 + PUSH AR6 + PUSH AR7 +ENDIF + mPendSV_Clear +; s_taskstacklen +IF SYSCFG_DEBUGGING == 1 + CLR C + MOV A, SP + SUBB A, #?STACK-1 + IF MCUCFG_TASK_REGBANK <> MCUCFG_OSIT_REGBANK + IF MCUCFG_XBPSTACK == 1 + ADD A, #MCUCFG_USERREGSIZE+8+2 + ELSE + ADD A, #MCUCFG_USERREGSIZE+8 + ENDIF + ELSE + IF MCUCFG_XBPSTACK == 1 + ADD A, #MCUCFG_USERREGSIZE+2 + ELSEIF MCUCFG_USERREGSIZE + ADD A, #MCUCFG_USERREGSIZE + ENDIF + ENDIF + MOV s_taskstacklen, A +ENDIF + LCALL sPendSV_Handler + + CLR C + MOV A, R7 + JNZ ?PROTECTING + LJMP RETURN +?PROTECTING: DEC A + JZ RESTORE + +; 任务PC监控 +IF SYSCFG_TASKPC_MONITOR == 1 + JNB s_taskmgr_sign, PROTECTING + MOV A, SP + IF MCUCFG_TASK_REGBANK == MCUCFG_OSIT_REGBANK + SUBB A, #15-1 + ELSE + SUBB A, #7-1 + ENDIF + MOV R0, A + MOV s_pc+1, @R0 + INC R0 + MOV s_pc, @R0 +ENDIF + +; 保护现场 +PROTECTING: +IF MCUCFG_USERREGCONFIG == 1 ; SAVE USERREG: 保护方案一 + mUserReg_PUSH +ENDIF + + MOV DPH, s_task_current ; Save the STACKLEN to s_task_current->stacklen. + MOV DPL, s_task_current+1 + MOV A, SP + SUBB A, #?STACK-1 + MOV R1, A + MOVX @DPTR, A + + MOV A, s_task_current+1 ; Get the address of s_task_current->bsp. + ADD A, m_bsp_add + MOV DPL, A + JNC GETCURBSP + INC DPH + CLR C +GETCURBSP: MOVX A, @DPTR ; Get the s_task_current->bsp. + MOV R0, A + INC DPTR + MOVX A, @DPTR + MOV DPH, R0 + MOV DPL, A + + MOV R0, #?STACK ; Get the start address of STACK. + +SAVESTACK: MOV A, @R0 ; SAVE STACK + MOVX @DPTR, A + INC R0 + INC DPTR + DJNZ R1, SAVESTACK + +IF MCUCFG_TASK_REGBANK <> MCUCFG_OSIT_REGBANK ; SAVE TASK-REGBANK + MOV A, AR0 + MOVX @DPTR, A + INC DPTR + MOV A, AR1 + MOVX @DPTR, A + INC DPTR + MOV A, AR2 + MOVX @DPTR, A + INC DPTR + MOV A, AR3 + MOVX @DPTR, A + INC DPTR + MOV A, AR4 + MOVX @DPTR, A + INC DPTR + MOV A, AR5 + MOVX @DPTR, A + INC DPTR + MOV A, AR6 + MOVX @DPTR, A + INC DPTR + MOV A, AR7 + MOVX @DPTR, A + IF MCUCFG_USERREGCONFIG == 2 || MCUCFG_XBPSTACK == 1 + INC DPTR + ENDIF +ENDIF + +IF MCUCFG_USERREGCONFIG == 2 ; SAVE USERREG: 保护方案二 + mUserReg_SAVE + IF MCUCFG_XBPSTACK == 1 + INC DPTR + ENDIF +ENDIF + +IF MCUCFG_XBPSTACK == 1 ; SAVE ?C_XBP + MOV A, ?C_XBP + MOVX @DPTR, A + INC DPTR + MOV A, ?C_XBP+1 + MOVX @DPTR, A +ENDIF + +; 恢复现场 +RESTORE: MOV s_task_current, s_task_news + MOV s_task_current+1, s_task_news+1 + + MOV DPH, s_task_current ; Get the STACKLEN from s_task_current->stacklen. + MOV DPL, s_task_current+1 + MOVX A, @DPTR + MOV R1, A + + MOV A, s_task_current+1 ; Get the address of s_task_current->bsp. + ADD A, m_bsp_add + MOV DPL, A + JNC GETNEWBSP + INC DPH + CLR C +GETNEWBSP: MOVX A, @DPTR ; Get the s_task_current->bsp. + MOV R0, A + INC DPTR + MOVX A, @DPTR + MOV DPH, R0 + MOV DPL, A + + MOV SP, #?STACK-1 ; Get the start address of STACK, minus one more. + +RESTORESTACK: MOVX A, @DPTR ; RESTORE STACK + PUSH ACC + INC DPTR + DJNZ R1, RESTORESTACK + +IF MCUCFG_USERREGCONFIG == 1 ; RESTORE USERREG: 保护方案一 + mUserReg_POP +ENDIF + +IF MCUCFG_TASK_REGBANK <> MCUCFG_OSIT_REGBANK ; RESTORE TASK-REGBANK + MOVX A, @DPTR + MOV AR0, A + INC DPTR + MOVX A, @DPTR + MOV AR1, A + INC DPTR + MOVX A, @DPTR + MOV AR2, A + INC DPTR + MOVX A, @DPTR + MOV AR3, A + INC DPTR + MOVX A, @DPTR + MOV AR4, A + INC DPTR + MOVX A, @DPTR + MOV AR5, A + INC DPTR + MOVX A, @DPTR + MOV AR6, A + INC DPTR + MOVX A, @DPTR + MOV AR7, A + IF MCUCFG_USERREGCONFIG == 2 || MCUCFG_XBPSTACK == 1 + INC DPTR + ENDIF +ENDIF + +IF MCUCFG_USERREGCONFIG == 2 ; RESTORE USERREG: 保护方案二 + mUserReg_RES + IF MCUCFG_XBPSTACK == 1 + INC DPTR + ENDIF +ENDIF + +IF MCUCFG_XBPSTACK == 1 ; RESTORE ?C_XBP + MOVX A, @DPTR + MOV R0, A + INC DPTR + MOVX A, @DPTR + JBC EA, __EA + MOV ?C_XBP, R0 + MOV ?C_XBP+1, A + SJMP RETURN +__EA: MOV ?C_XBP, R0 + MOV ?C_XBP+1, A + SETB EA +ENDIF + +RETURN: +IF MCUCFG_TASK_REGBANK == MCUCFG_OSIT_REGBANK + POP AR7 + POP AR6 + POP AR5 + POP AR4 + POP AR3 + POP AR2 + POP AR1 + POP AR0 +ENDIF + POP PSW + POP DPL + POP DPH + POP B + POP ACC + + RETI + +;/////////////////////////////////////////////////////////////////////////////// + +; 中断FIFO服务 + +IF MCUCFG_PENDSVFIFO_DEPTH > 0 + +; 中断FIFO服务-抢占队列项 + +?PR?mPendSV_FIFOPreempt?PORT_8051S SEGMENT CODE + 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?PORT_8051S +mPendSV_FIFOPreempt: + + CLR A + MOV DPH, A + JB m_sign_fifo, FIFO_0 + INC DPH + 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 A + RET + +FIFO_X_0: MOV R0, #0*2 + RET +FIFO_X_1: MOV R0, #1*2 + RET +FIFO_X_2: MOV R0, #2*2 + RET +FIFO_X_3: MOV R0, #3*2 + RET +FIFO_X_4: MOV R0, #4*2 + RET +FIFO_X_5: MOV R0, #5*2 + RET +FIFO_X_6: MOV R0, #6*2 + RET +FIFO_X_7: MOV R0, #7*2 + RET +IF MCUCFG_PENDSVFIFO_DEPTH > 8 +FIFO_X_8: MOV R0, #8*2 + RET +FIFO_X_9: MOV R0, #9*2 + RET +FIFO_X_10: MOV R0, #10*2 + RET +FIFO_X_11: MOV R0, #11*2 + RET +FIFO_X_12: MOV R0, #12*2 + RET +FIFO_X_13: MOV R0, #13*2 + RET +FIFO_X_14: MOV R0, #14*2 + RET +FIFO_X_15: MOV R0, #15*2 + RET +IF MCUCFG_PENDSVFIFO_DEPTH > 16 +FIFO_X_16: MOV R0, #16*2 + RET +FIFO_X_17: MOV R0, #17*2 + RET +FIFO_X_18: MOV R0, #18*2 + RET +FIFO_X_19: MOV R0, #19*2 + RET +FIFO_X_20: MOV R0, #20*2 + RET +FIFO_X_21: MOV R0, #21*2 + RET +FIFO_X_22: MOV R0, #22*2 + RET +FIFO_X_23: MOV R0, #23*2 + RET +IF MCUCFG_PENDSVFIFO_DEPTH > 24 +FIFO_X_24: MOV R0, #24*2 + RET +FIFO_X_25: MOV R0, #25*2 + RET +FIFO_X_26: MOV R0, #26*2 + RET +FIFO_X_27: MOV R0, #27*2 + RET +FIFO_X_28: MOV R0, #28*2 + RET +FIFO_X_29: MOV R0, #29*2 + RET +FIFO_X_30: MOV R0, #30*2 + RET +FIFO_X_31: MOV R0, #31*2 + RET +IF MCUCFG_PENDSVFIFO_DEPTH > 32 +FIFO_X_32: MOV R0, #32*2 + RET +FIFO_X_33: MOV R0, #33*2 + RET +FIFO_X_34: MOV R0, #34*2 + RET +FIFO_X_35: MOV R0, #35*2 + RET +FIFO_X_36: MOV R0, #36*2 + RET +FIFO_X_37: MOV R0, #37*2 + RET +FIFO_X_38: MOV R0, #38*2 + RET +FIFO_X_39: MOV R0, #39*2 + RET +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 A + RET + + +; 中断FIFO服务装载器 + +?PR?_mPendSV_FIFOLoader?PORT_8051S SEGMENT CODE + PUBLIC _mPendSV_FIFOLoader + RSEG ?PR?_mPendSV_FIFOLoader?PORT_8051S +_mPendSV_FIFOLoader: + + LCALL mPendSV_FIFOPreempt + JNZ FAILED + MOV DPL, R0 + MOV A, R6 + MOVX @DPTR, A + INC DPTR + MOV A, R7 + MOVX @DPTR, A +FAILED: RET + +ENDIF + +;/////////////////////////////////////////////////////////////////////////////// + +ENDIF + END