mirror of
https://gitee.com/cosyos/cosyos.git
synced 2026-08-17 16:52:27 +08:00
删除文件 Port
This commit is contained in:
@@ -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
|
||||
@@ -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
@@ -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
|
||||
@@ -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
|
||||
@@ -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
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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、指令集架构(0:ARMv6-M;1:ARMv7-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
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user