删除文件 Port

This commit is contained in:
零中断延迟的RTOS
2025-04-04 05:49:47 +00:00
committed by Gitee
parent 682894258f
commit 55aefa623a
16 changed files with 0 additions and 3669 deletions
View File
View File
-289
View File
@@ -1,289 +0,0 @@
/**************************************************************************//**
* @item CosyOS-III Port
* @file port_80251.c
* @brief 80251 Core Port File
* @author 迟凯峰
* @version V1.0.0
* @date 2025.02.08
******************************************************************************/
#include "..\System\os_var.h"
#ifdef __PORT_80251_H
s_u16_t _SYS_MEM_ m_bsp_add = sizeof(s_taskhand_ts);
/*
* 全局临界区
*/
static bit m_oldirq;
static volatile s_u8_t _SYS_MEM_ m_glocri_counter = 0;
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 = 0;
#endif
static void _STATIC_MEM_ *mPendSV_FIFO_0[MCUCFG_PENDSVFIFO_DEPTH] _at_ 0x0100;
static void _STATIC_MEM_ *mPendSV_FIFO_1[MCUCFG_PENDSVFIFO_DEPTH] _at_ 0x0200;
bit m_sign_fifo = true;
#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
static void _fifo_0_(s_u8_t i)
{
void _STATIC_MEM_ *sv = (void _STATIC_MEM_ *)(mPendSV_FIFO_0[i]);
(*sPendSV_FIFOHandler[*(const s_u8_t _STATIC_MEM_ *)sv])(sv);
}
static void _fifo_1_(s_u8_t i)
{
void _STATIC_MEM_ *sv = (void _STATIC_MEM_ *)(mPendSV_FIFO_1[i]);
(*sPendSV_FIFOHandler[*(const s_u8_t _STATIC_MEM_ *)sv])(sv);
}
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_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_0_ (n)
#else
#define mWriteCode(n) \
if(m_sign_fifo_0_##n) goto __LABLE_0; \
m_sign_fifo_0_##n = true; \
_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__
mPendSV_FIFO_DepthMAX = MCUCFG_PENDSVFIFO_DEPTH;
#endif
__LABLE_0:
m_sign_fifo = true;
#if SYSCFG_PENDSVFIFO_MONITOR == __ENABLED__
if(i > mPendSV_FIFO_DepthMAX) mPendSV_FIFO_DepthMAX = i;
#endif
if(m_sign_fifo_1_0) return;
m_sign_fifo_1_0 = true;
_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_1_ (n)
#else
#define mWriteCode(n) \
if(m_sign_fifo_1_##n) goto __LABLE_1; \
m_sign_fifo_1_##n = true; \
_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__
mPendSV_FIFO_DepthMAX = 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
-271
View File
@@ -1,271 +0,0 @@
/**************************************************************************//**
* @item CosyOS-III Port
* @file port_80251.h
* @brief 80251 Core Port File
* @author 迟凯峰
* @version V1.0.3
* @date 2025.03.18
******************************************************************************/
#ifndef __PORT_80251_H
#define __PORT_80251_H
/* Header */
#include <intrins.h>
#include "..\System\os_base.h"
#include "..\Config\syscfg.h"
#include "..\Config\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_u16_t m_stacksize_t;
typedef s_u32_t m_tick_t;
typedef s_u32_t m_pc_t;
typedef s_u16_t m_fetion_t;
typedef s_u32_t m_group_t;
/* 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 bool mPendSV_FIFOLoader (void _STATIC_MEM_ *sv);
extern void mPendSV_FIFOHandler(void);
/* PRAGMA */
#if MCUCFG_WARNINGDISABLE
#pragma warning disable = 47
#pragma warning disable = 177
#endif
/* CMSIS */
#ifndef __WEAK
#define __WEAK
#endif
#ifndef __NOP
#define __NOP _nop_
#endif
/* CONST & ATTRIBUTE */
#define MCUCFG_ISA __MCS_251__
#define MCUCFG_PCLEN 4
#define MCUCFG_C51USING
#define MCUCFG_SYSTICK_ATTRIBUTE interrupt 1
#define MCUCFG_TERNARYMASK
/** \PUSH {4 Byte Interrupt Frame,DR28-DR0,DR56,PSW1,PSW,[USERREG(ASM)]} */
#define MCUCFG_BASICSTACKSIZE (42 + MCUCFG_USERREGSIZE)
#define MCUCFG_STACK_ALIGN
/*
* MCUAPI
*/
/* TaskNode */
#define mTaskNode_Tail_ mUserReg_C_
/* SysTick */
#define mSysTick_CLKMOD (SYSCFG_SYSCLK / (1000000UL / SYSCFG_SYSTICKCYCLE) <= 65536 ? 1 : 12)
#define mSysTick_Cycle (SYSCFG_SYSCLK / (1000000UL / SYSCFG_SYSTICKCYCLE) / mSysTick_CLKMOD)
#if mSysTick_Cycle > 65536
#error 系统滴答定时器溢出,必须减小系统时钟或系统滴答周期。
#elif 1000000UL % SYSCFG_SYSTICKCYCLE
#warning 每秒钟的系统滴答周期数不为整数,建议重新调整系统滴答周期。
#elif SYSCFG_SYSCLK % (1000000UL / SYSCFG_SYSTICKCYCLE)
#warning 每秒钟的系统滴答周期数不为整数,建议重新调整系统时钟或系统滴答周期。
#elif SYSCFG_SYSCLK / (1000000UL / SYSCFG_SYSTICKCYCLE) % mSysTick_CLKMOD
#warning 每秒钟的系统滴答周期数不为整数,建议重新调整系统时钟或系统滴答周期。
#endif
#define mSysTick_InitValue (65536 - mSysTick_Cycle)
#define mSysTick_Counter ((TH0 << 8) | TL0)
#define mSysTick_Disable ET0 = 0
#define mSysTick_Enable ET0 = 1
#define mSysTick_Clear
#define mxDisableIRQ mx_disable_irq()
#define mxResumeIRQ mx_resume_irq()
#define mSysIRQ_Disable \
do{ \
mPendSV_Disable; \
mSysTick_Disable; \
}while(false)
#define mSysIRQ_Enable \
do{ \
mSysTick_Enable; \
mPendSV_Enable; \
}while(false)
#define mSys_Idle \
do{ \
PCON |= 0x01; \
OS_NOPx4; \
}while(false)
#define mSys_INIT \
do{ \
s_init_mempool((void _MALLOC_MEM_ *)MCUCFG_MALLOCMEMBPTR, MCUCFG_MALLOCMEMSIZE); \
OS_NOPx1; \
AUXR = mSysTick_CLKMOD == 1 ? AUXR | 0x80 : AUXR &~0x80; \
TMOD &= 0xF0; \
TL0 = (s_u8_t)(mSysTick_InitValue); \
TH0 = (s_u8_t)(mSysTick_InitValue >> 8); \
TR0 = 1; \
mSysIRQ_Enable; \
EA = 1; \
}while(false)
#define mSysTick_Counting \
do{ \
m_tick_t temp = mSysTick_Counter; \
if(temp <= tick_temp) break; \
s_tick_counter1 += temp - tick_temp; \
s_tick_counter2++; \
}while(false)
#define mUsedTime_END \
do{ \
if(usedtime[0]){ \
s_task_current->usedtime[0] += usedtime[0] - 1; \
usedtime[0] = 0; \
usedtime[1] = 65536 - usedtime[1] + tick_counter - mSysTick_InitValue; \
} \
else if(tick_counter <= usedtime[1]){ \
usedtime[0] = ~0; \
usedtime[1] = 65536 - usedtime[1] + tick_counter - mSysTick_InitValue; \
} \
else{ \
usedtime[1] = tick_counter - usedtime[1]; \
} \
s_task_current->usedtime[0] += (s_task_current->usedtime[1] + usedtime[1]) / mSysTick_Cycle; \
s_task_current->usedtime[1] = (s_task_current->usedtime[1] + usedtime[1]) % mSysTick_Cycle; \
}while(false)
#define mUsedTime_INIT \
do{ \
usedtime[1] = tick_counter; \
}while(false)
#if SYSCFG_PENDSVFIFO_MONITOR == __ENABLED__
#define mPendSV_FIFOLoad \
do{ \
if(!mPendSV_FIFOLoader(&u_psv)) \
mPendSV_Set; \
else s_fault.overflow_pendsvfifo = true; \
}while(false)
#else
#define mPendSV_FIFOLoad \
do{ \
if(!mPendSV_FIFOLoader(&u_psv)) \
mPendSV_Set; \
}while(false)
#endif
#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_INIT; \
mUserReg_CINIT; \
}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
#endif
File diff suppressed because it is too large Load Diff
-190
View File
@@ -1,190 +0,0 @@
;*******************************************************************************
;* @item CosyOS-III Port
;* @file startup_80251.s
;* @brief 80251 Core Startup File
;* @author 迟凯峰
;* @version V1.0.0
;* @date 2025.02.08
;*******************************************************************************
;
$INCLUDE (..\Config\syscfg.h)
IF SYSCFG_MCUCORE == 80251
$INCLUDE (..\Config\mcucfg_80251.h)
;
;///////////////////////////////////////////////////////////////////////////////
;
; 251 Configuration Bytes Definition for off-chip (external) config bytes
;
$SET (CONFIGB = 0) ; Set this variable if you want to set external config
; ; bytes at address FF:FFF8 and FF:FFF9.
;
; Wait State for PSEN#/RD#/WR# signal except region 01:xxxx (WSA1 & WSA0 Bits)
; WSA Val Description
; --- --- -----------
WSA EQU 3 ; 3 = 0 wait state for all regions except region 01:xxxx
; ; 2 = extended to 1 wait state for all regions except 01:xxxx
; ; 1 = extended to 2 wait states for all regions except 01:xxxx
; ; 0 = extended to 3 wait states for all regions except 01:xxxx
;
; Extend ALE pulse
; XALE Val Description
; ---- --- -----------
XALE EQU 1 ; 1 = ALE pulse is one TOSC
; ; 0 = ALE pulse is three TOSC, this adds one external wait state
;
; RD# and PSEN# Function Select (RD1 and RD0 Bits)
; RD Val RD Range PSEN Range P1.7 Func Features
; -- --- -------- ---------- --------- --------
RDRG EQU 3 ; 3 = <=7F:FFFF >=80:FFFF P1.7/CEX4 Compatible with 8051
; ; 2 = P3.7 only All address P1.7/CEX4 One additional port pin
; ; 1 = RD#=A16 All address P1.7/CEX4 128K External Address space
; ; 0 = RD#=A16 All address P1.7=A17 256K External Address space
;
; Page Mode Select
; PAGE Val Description
; ---- --- -----------
PAGM EQU 1 ; 1 = Non-page Mode (A15:8 on P2, A7:0/D7:0 on P0, 8051 compatible)
; ; 0 = Page Mode (A15:8/D7:0 on P2, A7:0 on P0)
;
; Interrupt Mode Select
; INTR Val Description
; ---- --- -----------
INTR EQU 1 ; 1 = Interrupt pushes 4 bytes onto the stack (PC & PSW1)
; ; 0 = Interrupt pushes 2 bytes onto the stack (PCL & PCH only)
;
; Extended Data Float (EDF) Timing Feature
; EDF Val Description
; ---- --- -----------
EDF EQU 1 ; 1 = Standard (Compatibility) Mode
; ; 0 = extend data float timing for slow memory devices
;
; Wait State for PSEN#/RD#/WR# signal for region 01:xxxx (WSB1 & WSB0 Bits)
; WSB Val Description
; --- --- -----------
WSB EQU 3 ; 3 = 0 wait state for region 01:xxxx
; ; 2 = extended to 1 wait state for regions 01:xxxx
; ; 1 = extended to 2 wait states for regions 01:xxxx
; ; 0 = extended to 3 wait states for regions 01:xxxx
;
; EPROM/ROM Mapping
; WSA Val Description
; --- --- -----------
EMAP EQU 1 ; 1 = Map internal ROM only to region FF:xxxx
; ; 0 = Map higher 8KB of internal ROM to region 00:E000 - 00:FFFF
;
; Note: the bit SRC is defined with the A251 directive MODSRC/MODBIN
;
;------------------------------------------------------------------------------
;
; User-defined Power-On Zero Initialization of Memory
;
; With the following EQU statements the zero initialization of memory
; at processor reset can be defined:
;
; ; the absolute start-address of EDATA memory is always 0
EDATALEN EQU 1000H ; the 16bits length of EDATA memory in bytes.
;
HDATASTART EQU 10000H ; the 24bits absolute start-address of HDATA memory.
HDATALEN EQU 2000H ; the 24bits length of HDATA memory in bytes.
;
; Note: The EDATA space overlaps physically the DATA, IDATA, BIT and EBIT areas,
; and the HDATA space overlaps physically the XDATA areas of the 251 CPU.
;
;------------------------------------------------------------------------------
;
; CPU Stack Size Definition for the MSP STACK MODE
;
; The following EQU statement defines the stack space available for the
; 251 application program. It should be noted that the stack space must
; be adjusted according the actual requirements of the application.
;
STACKSIZE EQU 100H ; set to 100H Bytes.
;
;------------------------------------------------------------------------------
$IF ROMHUGE
Prefix LIT '?'
Model LIT 'FAR'
PRSeg LIT 'ECODE'
$ELSE
Prefix LIT ''
Model LIT 'NEAR'
PRSeg LIT 'CODE'
$ENDIF
DPXL DATA 84H
;///////////////////////////////////////////////////////////////////////////////
NAME ?C_START{Prefix}
;///////////////////////////////////////////////////////////////////////////////
$IF (CONFIGB)
SRCM EQU 1 ; Select Source Mode
CONFIG0 EQU (WSA*20H)+(XALE*10H)+(RDRG*4)+(PAGM*2)+SRCM+080H
CONFIG1 EQU (INTR*10H)+(EDF*8)+(WSB*2)+EMAP+0E0H
CSEG AT 0FFF8H
DB CONFIG0 ; Config Byte 0
DB CONFIG1 ; Config Byte 1
$ENDIF
?C_C51STARTUP SEGMENT CODE
?C_C51STARTUP?3 SEGMENT CODE
?STACK SEGMENT EDATA
RSEG ?STACK
IF MCUCFG_TASKSTACK_MODE == __MSP__
DS STACKSIZE ; Stack Space 100H Bytes
ELSE
DS 1
ENDIF
EXTRN PRSeg (MAIN{Prefix})
EXTRN NUMBER(?C?XDATASEG) ; Start of XDATA Segment
PUBLIC ?C_STARTUP{Prefix}
PUBLIC ?C?STARTUP{Prefix}
CSEG AT 0
?C?STARTUP{Prefix}:
?C_STARTUP{Prefix}:
LJMP STARTUP1
RSEG ?C_C51STARTUP
STARTUP1: MOV DPXL, #?C?XDATASEG
IF EDATALEN <> 0
MOV WR10, #EDATALEN/4
MOV DR60, #0xFFFF
MOV DR12, #0
EDATALOOP: PUSH DR12
DEC WR10, #1
JNE EDATALOOP
ENDIF
IF HDATALEN <> 0
MOV DR12, #WORD0 HDATASTART
MOV WR12, #WORD2 HDATASTART
MOV DR16, #WORD0 HDATALEN/4
MOV WR16, #WORD2 HDATALEN/4
MOV WR20, #0
HDATALOOP: MOV @DR12+0, WR20
MOV @DR12+2, WR20
INC DR12, #4
DEC DR16, #1
JNE HDATALOOP
ENDIF
IF MCUCFG_TASKSTACK_MODE == __MSP__
MOV DR60, #WORD0 (?STACK-1)
ELSE
MOV DR60, #EDATALEN-512-1
ENDIF
RSEG ?C_C51STARTUP?3
JMP Model MAIN{Prefix}
;///////////////////////////////////////////////////////////////////////////////
ENDIF
END
View File
-289
View File
@@ -1,289 +0,0 @@
/**************************************************************************//**
* @item CosyOS-III Port
* @file port_8051.c
* @brief 8051 Core Port File
* @author 迟凯峰
* @version V1.0.0
* @date 2025.02.08
******************************************************************************/
#include "..\System\os_var.h"
#ifdef __PORT_8051_H
s_u8_t _SYS_MEM_ m_bsp_add = sizeof(s_taskhand_ts);
/*
* 全局临界区
*/
static bit m_oldirq;
static volatile s_u8_t _SYS_MEM_ m_glocri_counter = 0;
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 = 0;
#endif
static s_u16_t mPendSV_FIFO_0[MCUCFG_PENDSVFIFO_DEPTH] _at_ 0x0000;
static s_u16_t mPendSV_FIFO_1[MCUCFG_PENDSVFIFO_DEPTH] _at_ 0x0100;
bit m_sign_fifo = true;
#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
static void _fifo_0_(s_u8_t i) MCUCFG_C51USING
{
void _STATIC_MEM_ *sv = (void _STATIC_MEM_ *)(mPendSV_FIFO_0[i]);
(*sPendSV_FIFOHandler[*(const s_u8_t _STATIC_MEM_ *)sv])(sv);
}
static void _fifo_1_(s_u8_t i) MCUCFG_C51USING
{
void _STATIC_MEM_ *sv = (void _STATIC_MEM_ *)(mPendSV_FIFO_1[i]);
(*sPendSV_FIFOHandler[*(const s_u8_t _STATIC_MEM_ *)sv])(sv);
}
void mPendSV_FIFOHandler(void) MCUCFG_C51USING
{
#if SYSCFG_PENDSVFIFO_MONITOR == __ENABLED__
s_u8_t i;
#endif
__LABLE:
m_sign_fifo = false;
m_sign_fifo_0_0 = true;
_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_0_ (n)
#else
#define mWriteCode(n) \
if(m_sign_fifo_0_##n) goto __LABLE_0; \
m_sign_fifo_0_##n = true; \
_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__
mPendSV_FIFO_DepthMAX = MCUCFG_PENDSVFIFO_DEPTH;
#endif
__LABLE_0:
m_sign_fifo = true;
#if SYSCFG_PENDSVFIFO_MONITOR == __ENABLED__
if(i > mPendSV_FIFO_DepthMAX) mPendSV_FIFO_DepthMAX = i;
#endif
if(m_sign_fifo_1_0) return;
m_sign_fifo_1_0 = true;
_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_1_ (n)
#else
#define mWriteCode(n) \
if(m_sign_fifo_1_##n) goto __LABLE_1; \
m_sign_fifo_1_##n = true; \
_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__
mPendSV_FIFO_DepthMAX = 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
-234
View File
@@ -1,234 +0,0 @@
/**************************************************************************//**
* @item CosyOS-III Port
* @file port_8051.h
* @brief 8051 Core Port File
* @author 迟凯峰
* @version V1.0.3
* @date 2025.03.18
******************************************************************************/
#ifndef __PORT_8051_H
#define __PORT_8051_H
/* Header */
#include <intrins.h>
#include "..\System\os_base.h"
#include "..\Config\syscfg.h"
#include "..\Config\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_u8_t m_stacksize_t;
typedef s_u16_t m_tick_t;
typedef s_u16_t m_pc_t;
typedef s_u8_t m_fetion_t;
typedef s_u32_t m_group_t;
/* 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 bool mPendSV_FIFOLoader (s_u16_t sv);
extern void mPendSV_FIFOHandler(void);
/* CMSIS */
#ifndef __WEAK
#define __WEAK
#endif
#ifndef __NOP
#define __NOP _nop_
#endif
/* CONST & ATTRIBUTE */
#define MCUCFG_ISA __MCS_51__
#define MCUCFG_PCLEN 2
#if MCUCFG_TASK_REGBANK != MCUCFG_SYSINT_REGBANK
#define MCUCFG_C51USING using MCUCFG_SYSINT_REGBANK
#else
#define MCUCFG_C51USING
#endif
#define MCUCFG_SYSTICK_ATTRIBUTE interrupt 1 MCUCFG_C51USING
#define MCUCFG_TERNARYMASK false;
/** 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))
#define MCUCFG_STACK_ALIGN
#define MCUCFG_TASKSTACK_REALLOC __ENABLED__
#define MCUCFG_STACKSIZE_TASKMGR (MCUCFG_BASICSTACKSIZE + 16)
#define MCUCFG_STACKSIZE_DEBUGGER (MCUCFG_BASICSTACKSIZE + 16)
/*
* MCUAPI
*/
/* TaskNode */
#define mTaskNode_Head_ m_stacksize_t stacklen;
#define mTaskNode_Tail_ mUserReg_C_
/* SysTick */
#define mSysTick_CLKMOD (SYSCFG_SYSCLK / (1000000UL / SYSCFG_SYSTICKCYCLE) <= 65536 ? 1 : 12)
#define mSysTick_Cycle (SYSCFG_SYSCLK / (1000000UL / SYSCFG_SYSTICKCYCLE) / mSysTick_CLKMOD)
#if mSysTick_Cycle > 65536
#error 系统滴答定时器溢出,必须减小系统时钟或系统滴答周期。
#elif 1000000UL % SYSCFG_SYSTICKCYCLE
#warning 每秒钟的系统滴答周期数不为整数,建议重新调整系统滴答周期。
#elif SYSCFG_SYSCLK % (1000000UL / SYSCFG_SYSTICKCYCLE)
#warning 每秒钟的系统滴答周期数不为整数,建议重新调整系统时钟或系统滴答周期。
#elif SYSCFG_SYSCLK / (1000000UL / SYSCFG_SYSTICKCYCLE) % mSysTick_CLKMOD
#warning 每秒钟的系统滴答周期数不为整数,建议重新调整系统时钟或系统滴答周期。
#endif
#define mSysTick_InitValue (65536 - mSysTick_Cycle)
#define mSysTick_Counter ((TH0 << 8) | TL0)
#define mSysTick_Disable ET0 = 0
#define mSysTick_Enable ET0 = 1
#define mSysTick_Clear
#define mxDisableIRQ mx_disable_irq()
#define mxResumeIRQ mx_resume_irq()
#define mSysIRQ_Disable \
do{ \
mPendSV_Disable; \
mSysTick_Disable; \
}while(false)
#define mSysIRQ_Enable \
do{ \
mSysTick_Enable; \
mPendSV_Enable; \
}while(false)
#define mSys_Idle \
do{ \
PCON |= 0x01; \
OS_NOPx4; \
}while(false)
#define mSys_INIT \
do{ \
s_init_mempool((void _MALLOC_MEM_ *)MCUCFG_MALLOCMEMBPTR, MCUCFG_MALLOCMEMSIZE); \
OS_NOPx1; \
AUXR = mSysTick_CLKMOD == 1 ? AUXR | 0x80 : AUXR &~0x80; \
TMOD &= 0xF0; \
TL0 = (s_u8_t)(mSysTick_InitValue); \
TH0 = (s_u8_t)(mSysTick_InitValue >> 8); \
TR0 = 1; \
mSysIRQ_Enable; \
EA = 1; \
}while(false)
#define mSysTick_Counting \
do{ \
m_tick_t temp = mSysTick_Counter; \
if(temp <= tick_temp) break; \
s_tick_counter1 += temp - tick_temp; \
s_tick_counter2++; \
}while(false)
#define mUsedTime_END \
do{ \
if(usedtime[0]){ \
s_task_current->usedtime[0] += usedtime[0] - 1; \
usedtime[0] = 0; \
usedtime[1] = 65536 - usedtime[1] + tick_counter - mSysTick_InitValue; \
} \
else if(tick_counter <= usedtime[1]){ \
usedtime[0] = ~0; \
usedtime[1] = 65536 - usedtime[1] + tick_counter - mSysTick_InitValue; \
} \
else{ \
usedtime[1] = tick_counter - usedtime[1]; \
} \
s_task_current->usedtime[0] += (s_task_current->usedtime[1] + usedtime[1]) / mSysTick_Cycle; \
s_task_current->usedtime[1] = (s_task_current->usedtime[1] + usedtime[1]) % mSysTick_Cycle; \
}while(false)
#define mUsedTime_INIT \
do{ \
usedtime[1] = tick_counter; \
}while(false)
#if SYSCFG_PENDSVFIFO_MONITOR == __ENABLED__
#define mPendSV_FIFOLoad \
do{ \
if(!mPendSV_FIFOLoader((s_u16_t)&u_psv)) \
mPendSV_Set; \
else s_fault.overflow_pendsvfifo = true; \
}while(false)
#else
#define mPendSV_FIFOLoad \
do{ \
if(!mPendSV_FIFOLoader((s_u16_t)&u_psv)) \
mPendSV_Set; \
}while(false)
#endif
#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_SYSINT_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_INIT; \
mXBP_INIT; \
mUserReg_CINIT; \
}while(false)
#define mTaskStack_LEN
#endif
File diff suppressed because it is too large Load Diff
-104
View File
@@ -1,104 +0,0 @@
;*******************************************************************************
;* @item CosyOS-III Port
;* @file startup_8051.s
;* @brief 8051 Core Startup File
;* @author 迟凯峰
;* @version V1.0.0
;* @date 2025.02.08
;*******************************************************************************
;
$NOMOD51
$INCLUDE (..\Config\syscfg.h)
IF SYSCFG_MCUCORE == 8051
;
;------------------------------------------------------------------------------
; 基于 STARTUP.A51 而修改,摒弃了一些不常用的或用不到的功能,
; 并添加更为丰富的中文注释。
;
; *** <<< Use Configuration Wizard in Context Menu >>> ***
;------------------------------------------------------------------------------
;
; <h> 内存清零
;
; <o> IDATA内存大小 <0-256>
; <i> IDATA内存的绝对开始地址总是0,无需设置。
; <i> IDATA内存覆盖了物理DATA和BIT区域。
IDATALEN EQU 100H
;
; <o> XDATA内存开始地址 <0-0xFFFF>
; <i> XDATA内存的绝对开始地址。
XDATASTART EQU 0
;
; <o> XDATA内存大小 <0-0xFFFF>
; <i> XDATA内存大小。
XDATALEN EQU 8192
;
; </h>
;------------------------------------------------------------------------------
;
; <h> 可重入栈初始化
; <i> 如果在系统任务Starter运行之前,会用到可重入栈(典型的是在初始化钩子中使用),
; <i> 需初始化可重入栈。
;
; <q> XBPSTACK
; <i> 是否初始化大模型可重入栈(XBPSTACK)?
XBPSTACK EQU 0
;
; <o> XBPSTACKTOP <0x0-0xFFFF>
; <i> 设置XBPSTACK的栈顶指针。
XBPSTACKTOP EQU 0x1FFF +1
;
; </h>
;------------------------------------------------------------------------------
NAME ?C_STARTUP
?C_C51STARTUP SEGMENT CODE
?STACK SEGMENT IDATA
RSEG ?STACK
DS 1
EXTRN DATA (?C_XBP)
EXTRN CODE (?C_START)
PUBLIC ?C_STARTUP
CSEG AT 0
?C_STARTUP: LJMP STARTUP1
RSEG ?C_C51STARTUP
STARTUP1:
IF IDATALEN <> 0
MOV R0,#IDATALEN - 1
CLR A
IDATALOOP: MOV @R0,A
DJNZ R0,IDATALOOP
ENDIF
IF XDATALEN <> 0
MOV DPTR,#XDATASTART
MOV R7,#LOW (XDATALEN)
IF (LOW (XDATALEN)) <> 0
MOV R6,#(HIGH (XDATALEN)) +1
ELSE
MOV R6,#HIGH (XDATALEN)
ENDIF
CLR A
XDATALOOP: MOVX @DPTR,A
INC DPTR
DJNZ R7,XDATALOOP
DJNZ R6,XDATALOOP
ENDIF
IF XBPSTACK <> 0
MOV ?C_XBP,#HIGH XBPSTACKTOP
MOV ?C_XBP+1,#LOW XBPSTACKTOP
ENDIF
MOV SP,#?STACK-1
LJMP ?C_START
ENDIF
END
View File
-87
View File
@@ -1,87 +0,0 @@
/**************************************************************************//**
* @item CosyOS-III Port
* @file port_cmx.c
* @brief CMSIS Cortex-M Core Port File
* @author 迟凯峰
* @version V1.0.0
* @date 2025.02.08
******************************************************************************/
#include "..\System\os_var.h"
#ifdef __PORT_CMX_H
s_u32_t m_basepri = 1;
/*
* 中断挂起服务FIFO队列
*/
#if MCUCFG_PENDSVFIFO_DEPTH > 0
#if SYSCFG_PENDSVFIFO_MONITOR == __ENABLED__
s_u32_t mPendSV_FIFO_DepthMAX = 0;
#endif
void *mPendSV_FIFO[2][MCUCFG_PENDSVFIFO_DEPTH + 1];/*!< 中断挂起服务FIFO队列:FIFO0、FIFO1 */
void **mPendSV_FIFO_P0 = mPendSV_FIFO[0]; /*!< FIFO0指针 */
void **mPendSV_FIFO_P1 = mPendSV_FIFO[1]; /*!< FIFO1指针 */
volatile bool m_sign_fifo = true; /*!< FIFO 互斥访问锁:入FIFO与出FIFO的互斥
if(m_sign_fifo == true) {中断挂起服务装载器 独占访问 FIFO0,中断挂起服务处理器 独占访问 FIFO1}
if(m_sign_fifo == false){中断挂起服务装载器 独占访问 FIFO1,中断挂起服务处理器 独占访问 FIFO0} */
#if MCUCFG_PENDSVFIFO_MUTEX == 2 /*!< 互斥访问机制 */
void **mPendSV_FIFO_P2; /*!< FIFO替换指针 */
volatile bool m_sign_load = false; /*!< 互斥访问标志 */
#endif
/* 中断挂起服务处理器 */
void mPendSV_FIFOHandler(void)
{
register void **p;
register void *sv;
#if SYSCFG_PENDSVFIFO_MONITOR == __ENABLED__
register s_u32_t depth;
#endif
__LABLE:
m_sign_fifo = false;
/* 独占访问FIFO0 */
if(true){
#if SYSCFG_PENDSVFIFO_MONITOR == __ENABLED__
depth = (s_u32_t)(mPendSV_FIFO_P0 - mPendSV_FIFO[0]);
if(depth > mPendSV_FIFO_DepthMAX){
mPendSV_FIFO_DepthMAX = depth;
}
#endif
p = mPendSV_FIFO[0];
do{
sv = *++p;
(*sPendSV_FIFOHandler[*(const s_u8_t *)sv])(sv);
}while(mPendSV_FIFO_P0 > p);
mPendSV_FIFO_P0 = mPendSV_FIFO[0];
}
m_sign_fifo = true;
if(mPendSV_FIFO_P1 == mPendSV_FIFO[1]) return;
/* 独占访问FIFO1 */
if(true){
#if SYSCFG_PENDSVFIFO_MONITOR == __ENABLED__
depth = (s_u32_t)(mPendSV_FIFO_P1 - mPendSV_FIFO[1]);
if(depth > mPendSV_FIFO_DepthMAX){
mPendSV_FIFO_DepthMAX = depth;
}
#endif
p = mPendSV_FIFO[1];
do{
sv = *++p;
(*sPendSV_FIFOHandler[*(const s_u8_t *)sv])(sv);
}while(mPendSV_FIFO_P1 > p);
mPendSV_FIFO_P1 = mPendSV_FIFO[1];
}
if(mPendSV_FIFO_P0 > mPendSV_FIFO[0]) goto __LABLE;
}
#endif
#endif
-357
View File
@@ -1,357 +0,0 @@
/**************************************************************************//**
* @item CosyOS-III Port
* @file port_cmx.h
* @brief CMSIS Cortex-M Core Port File
* @author 迟凯峰
* @version V1.0.8
* @date 2025.03.18
******************************************************************************/
#ifndef __PORT_CMX_H
#define __PORT_CMX_H
/* Header */
#include <stdbool.h>
#include "..\System\os_base.h"
#include "..\Config\syscfg.h"
#include "..\Config\mcucfg_cmx.h"
#include SYSCFG_STANDARDHEAD
/* Memory */
#define _SYS_MEM_
#define _CODE_MEM_
#define _CONST_MEM_
#define _STACK_MEM_
#define _XDATA_MEM_
#define _STATIC_MEM_
#define _MALLOC_MEM_
#define _OBJ_MEM_
#define _RTC_MEM_
#define _QUE_MEM_
#define _DEBUG_MEM_
/* Register */
#define _SYS_REG_
/* Typedef */
#define m_boolvoid_tf *(s_boolvoid_tfp)
typedef unsigned long long int s_u64_t;
typedef bool m_bit_t;
typedef s_u32_t m_sp_t;
typedef s_u32_t m_stacksize_t;
typedef s_u32_t m_tick_t;
typedef s_u32_t m_pc_t;
typedef s_u32_t m_fetion_t;
typedef s_u32_t m_group_t;
/* Extern */
extern s_u32_t m_basepri;
#if MCUCFG_PENDSVFIFO_DEPTH > 0
extern s_u32_t mPendSV_FIFO_DepthMAX;
extern void *mPendSV_FIFO[2][MCUCFG_PENDSVFIFO_DEPTH + 1];
extern void **mPendSV_FIFO_P0;
extern void **mPendSV_FIFO_P1;
extern void mPendSV_FIFOLoader (void *sv);
extern void mPendSV_FIFOHandler(void);
#if MCUCFG_PENDSVFIFO_MUTEX == 2
/**
\brief 互斥访问机制-自动声明方式
\note 自动声明方式的优点是易用,缺点是全局所有非库函数都将无法使用该寄存器。<br>
为了追求更好的性能,您可采用手动声明方式:<br>
1、注释掉下方的自动声明;<br>
2、把所有调用中断挂起服务_FIFO的中断函数,统一放在一个C文件中,并在该文件中一次性声明全局寄存器变量。<br>
如在 stm32f0xx_it.c 文件中,在所有中断函数上方加入声明。
*/
/*
* Arm Compiler 4/5
*/
#if defined ( __CC_ARM )
#define MCUCFG_PENDSVFIFO_REGx r6
register void ***mPendSV_FIFO_REGx sCat2Str(__ASM, (sDefStr(MCUCFG_PENDSVFIFO_REGx)));
/*
* Arm Compiler 6
*/
#elif defined ( __ARMCC_VERSION )
#define MCUCFG_PENDSVFIFO_REGx r6
#pragma -ffixed-MCUCFG_PENDSVFIFO_REGx
#endif
#endif
#endif
/* CONST & ATTRIBUTE */
#define MCUCFG_ISA __ARM__
#define MCUCFG_PCLEN 4
#define MCUCFG_C51USING
#define MCUCFG_SYSTICK_ATTRIBUTE
#define MCUCFG_TERNARYMASK
#if MCUCFG_ASPEN_LSPEN == __ENABLED__
#define MCUCFG_CALLER_PUSH_FPU (18 * 4) /** \push {s0-s15,FPSCR,UNKNOW} */
#define MCUCFG_CALLEE_PUSH_FPU (16 * 4) /** \vstmdb {s16-s31} */
#else
#define MCUCFG_CALLER_PUSH_FPU 0
#define MCUCFG_CALLEE_PUSH_FPU 0
#endif
#define MCUCFG_CALLER_PUSH_REG (8 * 4) /** \push {r0-r3,r12,r14(lr),r15(pc),xPSR} */
#define MCUCFG_CALLEE_PUSH_REG (8 * 4) /** \stmdb {r4-r11} */
#define MCUCFG_CALLER_PUSH (MCUCFG_CALLER_PUSH_FPU + MCUCFG_CALLER_PUSH_REG)
#define MCUCFG_CALLEE_PUSH (MCUCFG_CALLEE_PUSH_FPU + MCUCFG_CALLEE_PUSH_REG)
#define MCUCFG_BASICSTACKSIZE (MCUCFG_CALLER_PUSH + MCUCFG_CALLEE_PUSH)
#define MCUCFG_STACK_ALIGN __ALIGNED(8)
#define MCUCFG_TASKSTACK_REALLOC __DISABLED__
#define MCUCFG_STACKSIZE_TASKMGR (MCUCFG_BASICSTACKSIZE * 2 + 24)
#define MCUCFG_STACKSIZE_DEBUGGER (MCUCFG_BASICSTACKSIZE * 2)
/*
* MCUAPI
*/
/* TaskNode */
#define mTaskNode_Head_ m_sp_t psp;
#define mTaskNode_Tail_ m_sp_t psp_top;
/* SysTick */
#define mSysTick_CLKMOD (MCUCFG_SYSTICKCLKSOURCE ? 1 : 8)
#define mSysTick_Cycle (SYSCFG_SYSCLK / (1000000UL / SYSCFG_SYSTICKCYCLE) / mSysTick_CLKMOD)
#if mSysTick_Cycle > 0x00FFFFFF
#error 系统滴答定时器溢出,必须减小系统时钟或系统滴答周期。
#elif 1000000UL % SYSCFG_SYSTICKCYCLE
#warning 每秒钟的系统滴答周期数不为整数,建议重新调整系统滴答周期。
#elif SYSCFG_SYSCLK % (1000000UL / SYSCFG_SYSTICKCYCLE)
#warning 每秒钟的系统滴答周期数不为整数,建议重新调整系统时钟或系统滴答周期。
#elif SYSCFG_SYSCLK / (1000000UL / SYSCFG_SYSTICKCYCLE) % mSysTick_CLKMOD
#warning 每秒钟的系统滴答周期数不为整数,建议重新调整系统时钟或系统滴答周期。
#endif
#define mSysTick_InitValue mSysTick_Cycle
#define mSysTick_Counter SysTick->VAL
#define mSysTick_CtrlReg SysTick->CTRL = (MCUCFG_SYSTICKCLKSOURCE ? 0x04 : 0x00) | 0x01
#define mSysTick_Enable SysTick->CTRL|= 0x02
#define mSysTick_Priority *(volatile s_u8_t *)0xE000ED23 = 0xFF
#define mSysTick_INIT \
do{ \
SysTick->LOAD = mSysTick_InitValue; \
mSysTick_Priority; \
mSysTick_CtrlReg; \
}while(false)
/* 系统中断 */
#if !MCUCFG_SYSINT
/* 0、SysTick_Handler + PendSV_Handler */
#define mSysTick2_INIT mSysTick_Enable
#define mPendSV_Priority *(volatile s_u8_t *)0xE000ED22 = 0xFF
#define mPendSV_Set *(volatile s_u32_t *)0xE000ED04 = 0x10000000
#define mPendSV_Clear
#define mPendSV_INIT \
do{ \
mPendSV_Priority; \
m_basepri <<= 7 - ((*(volatile s_u32_t *)0xE000ED00 >> 8) & 7); \
m_basepri--; \
m_basepri <<= 1 + ((*(volatile s_u32_t *)0xE000ED00 >> 8) & 7); \
}while(false)
#define mSysIRQ_Disable __mu_disable_sysirq()
#define mSysIRQ_Enable __set_BASEPRI(0)
#else
/* 1、TIMn_IRQHandler + XXX_IRQHandler */
#define mSysTick2_Priority *(volatile s_u32_t *)(0xE000E400 + MCUCFG_SYSTICKIRQ / 4 * 4)|= 0xFFUL << (MCUCFG_SYSTICKIRQ % 4) * 8
#define mPendSV_Priority *(volatile s_u32_t *)(0xE000E400 + MCUCFG_PENDSVIRQ / 4 * 4)|= 0xFFUL << (MCUCFG_PENDSVIRQ % 4) * 8
#define mPendSV_Set *(volatile s_u32_t *)(0xE000E200 + MCUCFG_PENDSVIRQ / 32 * 4) = 0x01UL << (MCUCFG_PENDSVIRQ % 32)/*
#define mPendSV_Clear *(volatile s_u32_t *)(0xE000E280 + MCUCFG_PENDSVIRQ / 32 * 4) = 0x01UL << (MCUCFG_PENDSVIRQ % 32)*/
#define mPendSV_Clear
#define mPendSV_INIT \
do{ \
mPendSV_Priority; \
m_basepri = 1 + ((*(volatile s_u32_t *)0xE000ED00 >> 8) & 7); \
}while(false)
#define mSysINT_Disable *(volatile s_u32_t *)(0xE000E180 + MCUCFG_PENDSVIRQ / 32 * 4) = (0x01UL << (MCUCFG_SYSTICKIRQ % 32)) \
| (0x01UL << (MCUCFG_PENDSVIRQ % 32))
#define mSysINT_Enable *(volatile s_u32_t *)(0xE000E100 + MCUCFG_PENDSVIRQ / 32 * 4) = (0x01UL << (MCUCFG_SYSTICKIRQ % 32)) \
| (0x01UL << (MCUCFG_PENDSVIRQ % 32))
#define mSysIRQ_Disable __mu_disable_sysirq()
#define mSysIRQ_Enable __mu_enable_sysirq()
#endif
#define mxDisableIRQ __mx_disable_irq()
#define mxMaskingPRI(newpri) __mx_masking_pri(newpri)
#define mxResumeIRQ(oldirq) __set_PRIMASK(oldirq)
#define mxResumePRI(oldpri) __set_BASEPRI(oldpri)
#define mSys_Idle __WFI()
#if MCUCFG_HARDWAREFPU == __ENABLED__
#define mCPACR_Set \
do{ \
*(volatile s_u32_t *)0xE000ED88 |= (0x0FUL << 20); \
__ASM("dsb"); \
}while(false) /*!< CPACR: CP11|CP10 */
#if MCUCFG_ASPEN_LSPEN == __ENABLED__
#define mFPCCR_Set \
do{ \
*(volatile s_u32_t *)0xE000EF34 |= (0x03UL << 30); \
__ASM("isb"); \
}while(false) /*!< FPCCR: ASPEN|LSPEN */
#define mFPSCR_INIT \
do{ \
*(volatile s_u32_t *)(node_news->psp - 8) = __get_FPSCR(); \
}while(false) /*!< FPSCR */
#else
#define mFPCCR_Set \
do{ \
*(volatile s_u32_t *)0xE000EF34 &=~(0x03UL << 30); \
__ASM("isb"); \
}while(false) /* FPCCR: ASPEN|LSPEN */
#define mFPSCR_INIT
#endif
#else
#define mCPACR_Set
#define mFPCCR_Set
#define mFPSCR_INIT
#endif
#define mSys_INIT \
do{ \
__set_PSP(__get_MSP() - 2 * MCUCFG_BASICSTACKSIZE); \
__set_CONTROL(0x02); \
*(volatile s_u32_t *)0xE000ED14 |= 0x0200; /* 栈8字节对齐 */ \
mCPACR_Set; \
mFPCCR_Set; \
mPendSV_INIT; \
mSysTick_INIT; \
mSysTick2_INIT; \
mSysIRQ_Enable; \
__ASM("cpsie i"); \
}while(false)
#define mSysTick_Counting \
do{ \
m_tick_t temp = mSysTick_Counter; \
if(tick_temp <= temp) break; \
s_tick_counter1 += tick_temp - temp; \
s_tick_counter2++; \
}while(false)
#define mTaskStack_INIT \
do{ \
node_news->psp_top = (m_sp_t)node_news->bsp + node_news->stacksize; \
if(node_news->psp_top % 8){ \
node_news->psp_top /= 8; \
node_news->psp_top *= 8; \
node_news->stacksize = node_news->psp_top - (m_sp_t)node_news->bsp; \
} \
node_news->psp = node_news->psp_top; \
mFPSCR_INIT; /* FPSCR */ \
*(volatile s_u32_t *)(node_news->psp - MCUCFG_CALLER_PUSH_FPU - 4) = 0x01000000; /* xPSR */ \
*(volatile s_u32_t *)(node_news->psp - MCUCFG_CALLER_PUSH_FPU - 8) = (s_u32_t)s_task_starter->entry; /* r15(pc) */ \
node_news->psp -= MCUCFG_BASICSTACKSIZE; \
}while(false)
#define mTaskStack_LEN \
s_taskstacklen = s_task_current->psp_top - __get_PSP() + MCUCFG_CALLEE_PUSH
#define mUsedTime_END \
do{ \
if(usedtime[0]){ \
s_task_current->usedtime[0] += usedtime[0] - 1; \
usedtime[0] = 0; \
usedtime[1] += mSysTick_InitValue - tick_counter; \
} \
else if(tick_counter >= usedtime[1]){ \
usedtime[0] = ~0; \
usedtime[1] += mSysTick_InitValue - tick_counter; \
} \
else{ \
usedtime[1] -= tick_counter; \
} \
s_task_current->usedtime[0] += (s_task_current->usedtime[1] + usedtime[1]) / mSysTick_Cycle; \
s_task_current->usedtime[1] = (s_task_current->usedtime[1] + usedtime[1]) % mSysTick_Cycle; \
}while(false)
#define mUsedTime_INIT \
do{ \
usedtime[1] = tick_counter; \
}while(false)
#define mPendSV_FIFOLoad \
do{ \
mPendSV_FIFOLoader(&u_psv); \
mPendSV_Set; \
}while(false)
#define mPendSV_FIFOHandle \
if(mPendSV_FIFO_P0 > mPendSV_FIFO[0]) mPendSV_FIFOHandler()
#define miWriteFlagBits \
if(!u_psv.value){ \
do{}while(false)
#define mUserReg_CSave
#define mUserReg_CRes
/*
* STATIC INLINE
*/
#if !MCUCFG_SYSINT
__STATIC_FORCEINLINE void __mu_disable_sysirq(void)
{
__set_BASEPRI(m_basepri);
__ASM("dsb");
__ASM("isb");
}
#else
__STATIC_FORCEINLINE void __mu_disable_sysirq(void)
{
mSysINT_Disable;
__ASM("dsb");
__ASM("isb");
}
__STATIC_FORCEINLINE void __mu_enable_sysirq(void)
{
mSysINT_Enable;
}
#if MCUCFG_BASEPRI_USED
__STATIC_INLINE s_u32_t __mx_masking_pri(s_u32_t newpri)
{
register s_u32_t oldpri = __get_BASEPRI();
__set_BASEPRI_MAX(newpri << m_basepri);
__ASM("dsb");
__ASM("isb");
return oldpri;
}
#endif
#endif
__STATIC_INLINE s_u32_t __mx_disable_irq(void)
{
register s_u32_t oldirq = __get_PRIMASK();
__ASM("cpsid i");
__ASM("nop");
return oldirq;
}
#endif
-230
View File
@@ -1,230 +0,0 @@
/**************************************************************************//**
* @item CosyOS-III Port
* @file port_cmx_s.c
* @brief CMSIS Cortex-M Core Port File
* @author 迟凯峰
* @version V1.0.2
* @date 2025.03.11
******************************************************************************/
#include "..\System\os_var.h"
#ifdef __PORT_CMX_H
/*
* 用户定义
*/
// 1、是否启用内嵌汇编移植方案?(0:禁用;1:启用)
#define CMXPRT_ARM 1
// 2、指令集架构(0ARMv6-M1ARMv7-M
#define CMXPRT_ISA 1
////////////////////////////////////////////////////////////////////////////////
#if CMXPRT_ARM == 1
/* PendSV软中断 */
__ASM void OS_PendSV_Handler(void)
{
IMPORT sPendSV_Handler
IMPORT s_task_current
IMPORT s_task_news
PRESERVE8
push {lr}
bl sPendSV_Handler
// 直接返回吗?
IF CMXPRT_ISA == 0
cmp r0, #0
beq __RETURN
ELSE
cbz r0, __RETURN
ENDIF
isb
// 保护现场吗?
ldr r1, =s_task_current
subs r0, #1
IF CMXPRT_ISA == 0
cmp r0, #0
beq __RESTORE
ELSE
cbz r0, __RESTORE
ENDIF
mrs r0, psp
IF SYSCFG_TASKPC_MONITOR == 1
// 任务PC监控
IMPORT s_sign_taskmgr
IMPORT s_pc
ldr r3, =s_sign_taskmgr
ldrb r3, [r3]
IF CMXPRT_ISA == 0
cmp r3, #0
beq __PROTECTING
ELSE
cbz r3, __PROTECTING
ENDIF
mov r3, r0
adds r3, #24
ldmia r3, {r2}
ldr r3, =s_pc
str r2, [r3]
ENDIF
// 保护现场
__PROTECTING
IF MCUCFG_ASPEN_LSPEN == 1
vstmdb r0!, {s16-s31}
ENDIF
IF CMXPRT_ISA == 0
subs r0, #MCUCFG_CALLEE_PUSH_REG
ldr r2, [r1]
str r0, [r2]
stmia r0!, {r4-r7}
mov r4, r8
mov r5, r9
mov r6, r10
mov r7, r11
stmia r0!, {r4-r7}
ELSE
stmdb r0!, {r4-r11}
ldr r2, [r1]
str r0, [r2]
ENDIF
// 恢复现场
__RESTORE ldr r3, =s_task_news
ldr r3, [r3]
str r3, [r1]
ldr r0, [r3]
IF CMXPRT_ISA == 0
adds r0, #16
ldmia r0!, {r4-r7}
mov r11, r7
mov r10, r6
mov r9, r5
mov r8, r4
mov r1, r0
subs r1, #MCUCFG_CALLEE_PUSH_REG
ldmia r1!, {r4-r7}
ELSE
ldmia r0!, {r4-r11}
ENDIF
IF MCUCFG_ASPEN_LSPEN == 1
vldmia r0!, {s16-s31}
ENDIF
msr psp, r0
// 返回
__RETURN pop {pc}
ALIGN
}
/* 中断挂起服务装载器 */
#if MCUCFG_PENDSVFIFO_DEPTH > 0
#define rx MCUCFG_PENDSVFIFO_REGx
__ASM void mPendSV_FIFOLoader(void *sv)
{
IMPORT mPendSV_FIFO_P0
IMPORT mPendSV_FIFO_P1
IMPORT m_sign_fifo
ldr r3, =m_sign_fifo
ldrb r3, [r3]
IF CMXPRT_ISA == 0
cmp r3, #0
beq __FIFO1
ELSE
cbz r3, __FIFO1
ENDIF
__FIFO0 ldr r1, =mPendSV_FIFO_P0
b __LOAD
__FIFO1 ldr r1, =mPendSV_FIFO_P1
IF MCUCFG_PENDSVFIFO_MUTEX == 1 // 互斥访问指令
__LOAD ldrex r2, [r1]
adds r2, #4
strex r3, r2, [r1]
cmp r3, #0
bne __LOAD
ELIF MCUCFG_PENDSVFIFO_MUTEX == 2 // 互斥访问机制
IMPORT mPendSV_FIFO_P2
IMPORT m_sign_load
__LOAD push {r0, r4}
mov r0, rx // 保护 rx
ldr r3, =m_sign_load
ldrb r4, [r3] // 保护 m_sign_load
movs r2, #1
strb r2, [r3] // 设置 m_sign_load
// 互斥访问 LOOP
__LOOP mov rx, r1
ldr r2, [rx]
adds r2, #4
str r2, [rx]
cmp rx, r1
bne __LOOP
strb r4, [r3] // 恢复 m_sign_load
// 重设或恢复 rx
// 如果 m_sign_load 的原值为0,证明本次装载未打断其它中断的装载过程(互斥访问 LOOP)-> 恢复 rx
// 否则证明发生了打断 -> 重设 rx。
IF CMXPRT_ISA == 0
cmp r4, #0
beq __RESrx
ELSE
cbz r4, __RESrx
ENDIF
ldr rx, =mPendSV_FIFO_P2 // 重设 rx
b __OVER
__RESrx mov rx, r0 // 恢复 rx
__OVER pop {r0, r4}
ELIF MCUCFG_PENDSVFIFO_MUTEX == 3 // 关闭总中断
__LOAD mrs r3, primask
cpsid i
ldr r2, [r1]
adds r2, #4
str r2, [r1]
msr primask, r3
ENDIF
str r0, [r2]
bx lr
ALIGN
}
#endif
#endif
#endif
-302
View File
@@ -1,302 +0,0 @@
;*******************************************************************************
;* @item CosyOS-III Port
;* @file port_cmx_s.s
;* @brief CMSIS Cortex-M Core Port File
;* @author 迟凯峰
;* @version V1.0.3
;* @date 2025.03.12
;*******************************************************************************
;* <<< Use Configuration Wizard in Context Menu >>>
;
; <e> 是否启用thumb汇编移植方案?
; <i> 启用该方案后,如果系统中断配置为 TIMn_IRQHandler + XXX_IRQHandler
; <i> 用户还需要在下方手动修改 PendSV_Handler 为 XXX_IRQHandler。
CMXPRT_THUMB EQU 0
;
MACRO
M1_PendSV_Handler
M2_PendSV_Handler PendSV_Handler ;用户在此修改
MEND
;
; <o> 指令集架构
; <0=> ARMv6-M <1=> ARMv7-M
CMXPRT_ISA EQU 0
;
; <q> 是否启用DEBUG接口并同时启用任务PC监控?
SYSCFG_TASKPC_MONITOR EQU 0
;
; <e> 是否启用PendSV_FIFO
CMXPRT_PENDSVFIFO EQU 1
;
; <o> PendSV_FIFO互斥访问方案
; <1=> 互斥访问指令 <2=> 互斥访问机制 <3=> 关闭总中断
;
; <i> 方案一、互斥访问指令
; <i> 该方案仅适用于Cortex-M3/M4/M7等支持互斥访问指令[LDREX/STREX]的内核,可实现全局不关总中断、零中断延迟。
;
; <i> 方案二、互斥访问机制
; <i> 该方案适用于所有ARM内核,可实现全局不关总中断、零中断延迟。
; <i> 缺点是在默认情况下、为提高易用性,系统会自动声明“全局寄存器变量”专用于互斥访问,这使得全局所有非库函数都将无法使用该寄存器。
; <i> 为了追求更好的性能,您可采用手动声明方式:
; <i> 1、注释掉 port_cmx.h 文件中的自动声明;
; <i> 2、把所有调用中断挂起服务_FIFO的中断函数,统一放在一个C文件中,并在该文件中一次性声明全局寄存器变量。
; <i> 如在 stm32f0xx_it.c 文件中,在所有中断函数上方加入声明。
;
; <i> 方案三、关闭总中断
; <i> 该方案适用于所有ARM内核,并具有极短的、确定的关闭总中断时间(包括再次开启总中断在内,不超过10个指令周期)。
; <i> 该方案,内核关闭总中断仅发生在中断挂起服务装载器中的__LOAD段。
MCUCFG_PENDSVFIFO_MUTEX EQU 2
; </e>
;
; <q> 浮点寄存器上下文自动保存
; <i> 是否启用浮点寄存器的上下文自动保存功能?
; <i> 如果启用了硬件浮点单元,并且在多个任务或中断中都要进行浮点运算,应该开启该功能;
; <i> 如果仅在特定的一个任务或中断中进行浮点运算,可以关闭该功能以提高性能。
MCUCFG_ASPEN_LSPEN EQU 0
; </e>
;
;///////////////////////////////////////////////////////////////////////////////
;
; 以下为系统定义,用户不要随意修改。
;
MACRO
M1_PendSV_FIFOLoader
M2_PendSV_FIFOLoader r6
MEND
;
MCUCFG_CALLEE_PUSH_REG EQU 32
;
;///////////////////////////////////////////////////////////////////////////////
IF CMXPRT_THUMB == 1
THUMB
AREA |.text|, CODE, READONLY
;///////////////////////////////////////////////////////////////////////////////
; PendSV软中断
MACRO
M2_PendSV_Handler $name
$name PROC
EXPORT $name
;@{
IMPORT sPendSV_Handler
IMPORT s_task_current
IMPORT s_task_news
PRESERVE8
push {lr}
bl sPendSV_Handler
IF CMXPRT_ISA == 0
cmp r0, #0
beq __RETURN
ELSE
cbz r0, __RETURN
ENDIF
isb
ldr r1, =s_task_current
subs r0, #1
IF CMXPRT_ISA == 0
cmp r0, #0
beq __RESTORE
ELSE
cbz r0, __RESTORE
ENDIF
mrs r0, psp
IF SYSCFG_TASKPC_MONITOR == 1
IMPORT s_sign_taskmgr
IMPORT s_pc
ldr r3, =s_sign_taskmgr
ldrb r3, [r3]
IF CMXPRT_ISA == 0
cmp r3, #0
beq __PROTECTING
ELSE
cbz r3, __PROTECTING
ENDIF
mov r3, r0
adds r3, #24
ldmia r3, {r2}
ldr r3, =s_pc
str r2, [r3]
ENDIF
__PROTECTING
IF MCUCFG_ASPEN_LSPEN == 1
vstmdb r0!, {s16-s31}
ENDIF
IF CMXPRT_ISA == 0
subs r0, #MCUCFG_CALLEE_PUSH_REG
ldr r2, [r1]
str r0, [r2]
stmia r0!, {r4-r7}
mov r4, r8
mov r5, r9
mov r6, r10
mov r7, r11
stmia r0!, {r4-r7}
ELSE
stmdb r0!, {r4-r11}
ldr r2, [r1]
str r0, [r2]
ENDIF
__RESTORE ldr r3, =s_task_news
ldr r3, [r3]
str r3, [r1]
ldr r0, [r3]
IF CMXPRT_ISA == 0
adds r0, #16
ldmia r0!, {r4-r7}
mov r11, r7
mov r10, r6
mov r9, r5
mov r8, r4
mov r1, r0
subs r1, #MCUCFG_CALLEE_PUSH_REG
ldmia r1!, {r4-r7}
ELSE
ldmia r0!, {r4-r11}
ENDIF
IF MCUCFG_ASPEN_LSPEN == 1
vldmia r0!, {s16-s31}
ENDIF
msr psp, r0
__RETURN pop {pc}
ALIGN
;@}
ENDP
MEND
M1_PendSV_Handler
;///////////////////////////////////////////////////////////////////////////////
; 中断挂起服务装载器
IF CMXPRT_PENDSVFIFO == 1
MACRO
M2_PendSV_FIFOLoader $rx
mPendSV_FIFOLoader PROC
EXPORT mPendSV_FIFOLoader
;@{
IMPORT mPendSV_FIFO_P0
IMPORT mPendSV_FIFO_P1
IMPORT m_sign_fifo
ldr r3, =m_sign_fifo
ldrb r3, [r3]
IF CMXPRT_ISA == 0
cmp r3, #0
beq __FIFO1
ELSE
cbz r3, __FIFO1
ENDIF
__FIFO0 ldr r1, =mPendSV_FIFO_P0
b __LOAD
__FIFO1 ldr r1, =mPendSV_FIFO_P1
IF MCUCFG_PENDSVFIFO_MUTEX == 1
__LOAD ldrex r2, [r1]
adds r2, #4
strex r3, r2, [r1]
cmp r3, #0
bne __LOAD
ELIF MCUCFG_PENDSVFIFO_MUTEX == 2
IMPORT mPendSV_FIFO_P2
IMPORT m_sign_load
__LOAD push {r0, r4}
mov r0, $rx
ldr r3, =m_sign_load
ldrb r4, [r3]
movs r2, #1
strb r2, [r3]
__LOOP mov $rx, r1
ldr r2, [$rx]
adds r2, #4
str r2, [$rx]
cmp $rx, r1
bne __LOOP
strb r4, [r3]
IF CMXPRT_ISA == 0
cmp r4, #0
beq __RESrx
ELSE
cbz r4, __RESrx
ENDIF
ldr $rx, =mPendSV_FIFO_P2
b __OVER
__RESrx mov $rx, r0
__OVER pop {r0, r4}
ELIF MCUCFG_PENDSVFIFO_MUTEX == 3
__LOAD mrs r3, primask
cpsid i
ldr r2, [r1]
adds r2, #4
str r2, [r1]
msr primask, r3
ENDIF
str r0, [r2]
bx lr
ALIGN
;@}
ENDP
MEND
M1_PendSV_FIFOLoader
ENDIF
;///////////////////////////////////////////////////////////////////////////////
ENDIF
END