update 移植文件.

Signed-off-by: 零中断延迟的RTOS <cosyos@139.com>
This commit is contained in:
零中断延迟的RTOS
2026-01-13 09:27:48 +00:00
committed by Gitee
parent 564dfb4d01
commit ca65cdc039
3 changed files with 1224 additions and 0 deletions

293
Port/80251/port_80251.c Normal file
View File

@@ -0,0 +1,293 @@
/**************************************************************************//**
* @item CosyOS-III Port
* @file port_80251.c
* @brief 80251 Core Port File
* @author 迟凯峰
* @version V2.2.0
* @date 2026.01.13
******************************************************************************/
#include "os_var.h"
#ifdef __PORT_80251_H
s_u16_t _SYS_MEM_ m_bsp_add = sizeof(s_taskhand_ts);
static s_u8_t xdata mVOID _at_ 0;
/*
* 全局临界区
*/
static bit m_oldirq;
static volatile s_u8_t _SYS_MEM_ m_glocri_counter/**/sZeroInstall;
void mx_disable_irq(void)
{
if(_testbit_(EA)){
m_oldirq = 1;
}
else if(!m_glocri_counter){
m_oldirq = 0;
}
m_glocri_counter++;
}
void mx_resume_irq(void)
{
m_glocri_counter--;
if(!m_glocri_counter){
EA = m_oldirq;
}
}
/*
* 中断FIFO服务
*/
#if (MCUCFG_PENDSVFIFO_DEPTH > 0)
#if (SYSCFG_PENDSVFIFO_MONITOR == __ENABLED__)
s_u8_t mPendSV_FIFO_DepthMAX/**/sZeroInstall;
#endif
bit m_sign_fifo = true;
static void _STATIC_MEM_ *mPendSV_FIFO_0[MCUCFG_PENDSVFIFO_DEPTH + MCUCFG_PENDSVFIFO_MUTEX - 1] _at_ 0x0100;
static void _STATIC_MEM_ *mPendSV_FIFO_1[MCUCFG_PENDSVFIFO_DEPTH + MCUCFG_PENDSVFIFO_MUTEX - 1] _at_ 0x0200;
static void _fifo_x_(void _STATIC_MEM_ *sv)
{
(*sPendSV_FIFOHandler[*(const s_u8_t _STATIC_MEM_ *)sv])(sv);
}
s_u8_t _SYS_MEM_ m_fifo_0_count = MCUCFG_PENDSVFIFO_DEPTH;
s_u8_t _SYS_MEM_ m_fifo_1_count = MCUCFG_PENDSVFIFO_DEPTH;
#define mWriteCode(n) \
bit m_sign_fifo_0_##n = true; \
bit m_sign_fifo_1_##n = true
mWriteCode(0);
mWriteCode(1);
mWriteCode(2);
mWriteCode(3);
mWriteCode(4);
mWriteCode(5);
mWriteCode(6);
mWriteCode(7);
#if (MCUCFG_PENDSVFIFO_DEPTH > 8)
mWriteCode(8);
mWriteCode(9);
mWriteCode(10);
mWriteCode(11);
mWriteCode(12);
mWriteCode(13);
mWriteCode(14);
mWriteCode(15);
#if (MCUCFG_PENDSVFIFO_DEPTH > 16)
mWriteCode(16);
mWriteCode(17);
mWriteCode(18);
mWriteCode(19);
mWriteCode(20);
mWriteCode(21);
mWriteCode(22);
mWriteCode(23);
#if (MCUCFG_PENDSVFIFO_DEPTH > 24)
mWriteCode(24);
mWriteCode(25);
mWriteCode(26);
mWriteCode(27);
mWriteCode(28);
mWriteCode(29);
mWriteCode(30);
mWriteCode(31);
#if (MCUCFG_PENDSVFIFO_DEPTH > 32)
mWriteCode(32);
mWriteCode(33);
mWriteCode(34);
mWriteCode(35);
mWriteCode(36);
mWriteCode(37);
mWriteCode(38);
mWriteCode(39);
#endif
#endif
#endif
#endif
#undef mWriteCode
void mPendSV_FIFOHandler(void)
{
#if (SYSCFG_PENDSVFIFO_MONITOR == __ENABLED__)
s_u8_t i;
#endif
__LABLE:
m_sign_fifo = false;
m_sign_fifo_0_0 = true;
_fifo_x_(*(void _STATIC_MEM_ * _STATIC_MEM_ *)(mPendSV_FIFO_0 + 0));
#if (SYSCFG_PENDSVFIFO_MONITOR == __ENABLED__)
#define mWriteCode(n) \
if(m_sign_fifo_0_##n){ i = n; goto __LABLE_0; } \
m_sign_fifo_0_##n = true; \
_fifo_x_(*(void _STATIC_MEM_ * _STATIC_MEM_ *)(mPendSV_FIFO_0 + n))
#else
#define mWriteCode(n) \
if(m_sign_fifo_0_##n) goto __LABLE_0; \
m_sign_fifo_0_##n = true; \
_fifo_x_(*(void _STATIC_MEM_ * _STATIC_MEM_ *)(mPendSV_FIFO_0 + n))
#endif
mWriteCode(1);
mWriteCode(2);
mWriteCode(3);
mWriteCode(4);
mWriteCode(5);
mWriteCode(6);
mWriteCode(7);
#if (MCUCFG_PENDSVFIFO_DEPTH > 8)
mWriteCode(8);
mWriteCode(9);
mWriteCode(10);
mWriteCode(11);
mWriteCode(12);
mWriteCode(13);
mWriteCode(14);
mWriteCode(15);
#if (MCUCFG_PENDSVFIFO_DEPTH > 16)
mWriteCode(16);
mWriteCode(17);
mWriteCode(18);
mWriteCode(19);
mWriteCode(20);
mWriteCode(21);
mWriteCode(22);
mWriteCode(23);
#if (MCUCFG_PENDSVFIFO_DEPTH > 24)
mWriteCode(24);
mWriteCode(25);
mWriteCode(26);
mWriteCode(27);
mWriteCode(28);
mWriteCode(29);
mWriteCode(30);
mWriteCode(31);
#if (MCUCFG_PENDSVFIFO_DEPTH > 32)
mWriteCode(32);
mWriteCode(33);
mWriteCode(34);
mWriteCode(35);
mWriteCode(36);
mWriteCode(37);
mWriteCode(38);
mWriteCode(39);
#endif
#endif
#endif
#endif
#undef mWriteCode
#if (SYSCFG_PENDSVFIFO_MONITOR == __ENABLED__)
if(m_fifo_0_count > mPendSV_FIFO_DepthMAX){
mPendSV_FIFO_DepthMAX = m_fifo_0_count;
}
m_fifo_0_count = MCUCFG_PENDSVFIFO_DEPTH;
#endif
__LABLE_0:
#if (SYSCFG_PENDSVFIFO_MONITOR == __ENABLED__)
if(i > mPendSV_FIFO_DepthMAX){
mPendSV_FIFO_DepthMAX = i;
}
#endif
m_sign_fifo = true;
if(m_sign_fifo_1_0) return;
m_sign_fifo_1_0 = true;
_fifo_x_(*(void _STATIC_MEM_ * _STATIC_MEM_ *)(mPendSV_FIFO_1 + 0));
#if (SYSCFG_PENDSVFIFO_MONITOR == __ENABLED__)
#define mWriteCode(n) \
if(m_sign_fifo_1_##n){ i = n; goto __LABLE_1; } \
m_sign_fifo_1_##n = true; \
_fifo_x_(*(void _STATIC_MEM_ * _STATIC_MEM_ *)(mPendSV_FIFO_1 + n))
#else
#define mWriteCode(n) \
if(m_sign_fifo_1_##n) goto __LABLE_1; \
m_sign_fifo_1_##n = true; \
_fifo_x_(*(void _STATIC_MEM_ * _STATIC_MEM_ *)(mPendSV_FIFO_1 + n))
#endif
mWriteCode(1);
mWriteCode(2);
mWriteCode(3);
mWriteCode(4);
mWriteCode(5);
mWriteCode(6);
mWriteCode(7);
#if (MCUCFG_PENDSVFIFO_DEPTH > 8)
mWriteCode(8);
mWriteCode(9);
mWriteCode(10);
mWriteCode(11);
mWriteCode(12);
mWriteCode(13);
mWriteCode(14);
mWriteCode(15);
#if (MCUCFG_PENDSVFIFO_DEPTH > 16)
mWriteCode(16);
mWriteCode(17);
mWriteCode(18);
mWriteCode(19);
mWriteCode(20);
mWriteCode(21);
mWriteCode(22);
mWriteCode(23);
#if (MCUCFG_PENDSVFIFO_DEPTH > 24)
mWriteCode(24);
mWriteCode(25);
mWriteCode(26);
mWriteCode(27);
mWriteCode(28);
mWriteCode(29);
mWriteCode(30);
mWriteCode(31);
#if (MCUCFG_PENDSVFIFO_DEPTH > 32)
mWriteCode(32);
mWriteCode(33);
mWriteCode(34);
mWriteCode(35);
mWriteCode(36);
mWriteCode(37);
mWriteCode(38);
mWriteCode(39);
#endif
#endif
#endif
#endif
#undef mWriteCode
#if (SYSCFG_PENDSVFIFO_MONITOR == __ENABLED__)
if(m_fifo_1_count > mPendSV_FIFO_DepthMAX){
mPendSV_FIFO_DepthMAX = m_fifo_1_count;
}
m_fifo_1_count = MCUCFG_PENDSVFIFO_DEPTH;
#endif
__LABLE_1:
#if (SYSCFG_PENDSVFIFO_MONITOR == __ENABLED__)
if(i > mPendSV_FIFO_DepthMAX){
mPendSV_FIFO_DepthMAX = i;
}
#endif
if(!m_sign_fifo_0_0) goto __LABLE;
}
#endif
#endif

248
Port/80251/port_80251.h Normal file
View File

@@ -0,0 +1,248 @@
/**************************************************************************//**
* @item CosyOS-III Port
* @file port_80251.h
* @brief 80251 Core Port File
* @author 迟凯峰
* @version V2.2.0
* @date 2026.01.13
******************************************************************************/
#ifndef __PORT_80251_H
#define __PORT_80251_H
/* INCLUDE */
#include <intrins.h>
#include "os_base.h"
#include "os_def.h"
#include "syscfg.h"
#include "mcucfg_80251.h"
#include SYSCFG_STANDARDHEAD
/* Memory */
#define _SYS_MEM_ data
#define _CODE_MEM_
#define _CONST_MEM_
#define _STACK_MEM_ near
#define _XDATA_MEM_ xdata
#if (MCUCFG_MEMORYMODEL == 0)
#define _STATIC_MEM_ near
#define _MALLOC_MEM_ near
#define _OBJ_MEM_ near
#elif (MCUCFG_MEMORYMODEL == 1)
#define _STATIC_MEM_ near
#define _MALLOC_MEM_ near
#define _OBJ_MEM_ near
#elif (MCUCFG_MEMORYMODEL == 2)
#define _STATIC_MEM_ near
#define _MALLOC_MEM_ xdata
#define _OBJ_MEM_
#elif (MCUCFG_MEMORYMODEL == 3)
#define _STATIC_MEM_ xdata
#define _MALLOC_MEM_ near
#define _OBJ_MEM_
#elif (MCUCFG_MEMORYMODEL == 4)
#define _STATIC_MEM_ xdata
#define _MALLOC_MEM_ xdata
#define _OBJ_MEM_ xdata
#endif
/*
* 用户自定义内存
* 用户可自定义下方的内存以寻求在性能和资源之间取得平衡。默认为未定义由内存MODEL决定。
* 在 os_var.c、os_var.h 中,用户也可逐个查看及调整对应定义内存的变量,以实现极致的优化。
*/
#define _RTC_MEM_ /* 软件RTC相关系统变量的内存 */
#define _DEBUG_MEM_ /* DEBUG相关系统变量的内存 */
/* Register */
#define _SYS_REG_
/* Typedef */
#define m_boolvoid_tf *(s_boolvoid_tfp)
#ifndef bool
typedef s_u8_t bool;
#endif
typedef bit m_bit_t;
typedef s_u16_t m_sp_t;
typedef s_u32_t m_tick_t;
typedef s_u32_t m_pc_t;
typedef s_u16_t m_tqcount_t;
typedef s_u16_t m_fetion_t;
typedef s_u32_t m_group_t;
typedef s_u16_t m_stacksize_t;
typedef s_u16_t m_stacklen_t;
#if (SYSCFG_SYSTICK_CYCLE > 1000000UL / 65536)
typedef s_u16_t m_rtccount_t;
#else
typedef s_u32_t m_rtccount_t;
#endif
/* Extern */
extern bit m_sign_fifo_0_0;
extern s_u8_t mPendSV_FIFO_DepthMAX;
extern void mx_disable_irq(void);
extern void mx_resume_irq (void);
extern void mPendSV_FIFOHandler(void);
#pragma SAVE
#pragma functions(static)
extern void mPendSV_FIFOLoader (void _STATIC_MEM_ *sv);
#pragma RESTORE
/* CMSIS */
#ifndef __WEAK
#define __WEAK
#endif
#ifndef __NOP
#define __NOP _nop_
#endif
#ifndef __STATIC_FORCEINLINE
#define __STATIC_FORCEINLINE static
#endif
#ifndef __NOINLINE
#define __NOINLINE
#endif
#define __UNUSED(X) void *p_##X = (void *)X
/* CONST & ATTRIBUTE */
#define MCUCFG_ISA __MCS_251__
#define MCUCFG_PCLEN 4
#define MCUCFG_TASK_ATTRIBUTE
#define MCUCFG_OSIT_ATTRIBUTE
#define MCUCFG_SYSTICK_ATTRIBUTE interrupt 1
#define MCUCFG_TERNARYMASK
#define MCUCFG_STACK_ALIGN
/** \PUSH {4 Byte Interrupt Frame,DR28-DR0,DR56,PSW1,PSW,[USERREG(ASM)]} */
#define MCUCFG_BASICSTACKSIZE (42 + MCUCFG_USERREGSIZE)
/* TaskNode */
#define mTaskNode_Tail_ mUserReg_DEFc_
/* SysTick */
#define MCUCFG_SYSTICK_COUNTMODE 3 /*!< 计数方式3从重装载值向上计数至零溢出 */
#define MCUCFG_SYSTICK_LIMITVALUE (1UL << 16) /*!< 极限值 */
#define MCUCFG_SYSTICK_CURRVALUE ((TH0 << 8) | TL0) /*!< 当前值寄存器 */
#define MCUCFG_SYSTICK_CLKDIV ((MCUCFG_SYSCLKHZ / 1000UL * SYSCFG_SYSTICK_CYCLE <= MCUCFG_SYSTICK_MAXVALUE * 1000UL) ? 1 : 12)
#define MCUCFG_SYSTICK_COUNT1CYC ((MCUCFG_SYSCLKHZ / 1000UL * SYSCFG_SYSTICK_CYCLE) / MCUCFG_SYSTICK_CLKDIV / 1000UL)
#define MCUCFG_SYSTICK_LOADVALUE (MCUCFG_SYSTICK_LIMITVALUE - MCUCFG_SYSTICK_COUNT1CYC)
#define MCUCFG_SYSTICK_MAXVALUE MCUCFG_SYSTICK_LIMITVALUE
#define MCUCFG_SYSTICK_MINVALUE MCUCFG_SYSTICK_LOADVALUE
#if (MCUCFG_SYSTICK_COUNT1CYC > (MCUCFG_SYSTICK_LIMITVALUE - 1))
#error 系统滴答定时器溢出。
#endif
#define mSysTick_INIT() \
do{ \
AUXR = MCUCFG_SYSTICK_CLKDIV == 1 ? AUXR | 0x80 : AUXR &~0x80; \
TMOD &= 0xF0; \
TL0 = (s_u8_t)(MCUCFG_SYSTICK_LOADVALUE); \
TH0 = (s_u8_t)(MCUCFG_SYSTICK_LOADVALUE >> 8); \
TR0 = 1; \
}while(false)
#define mSysTick_Disable() ET0 = 0
#define mSysTick_Enable() ET0 = 1
#define mSysTick_Clear()
/* 内核锁 */
#define mSysIRQ_Disable() \
do{ \
mPendSV_Disable(); \
mSysTick_Disable(); \
}while(false)
#define mSysIRQ_Enable() \
do{ \
mSysTick_Enable(); \
mPendSV_Enable(); \
}while(false)
/* CosyOS初始化 */
#define mCosyOS_INIT() \
do{ \
s_init_mempool((void _MALLOC_MEM_ *)MCUCFG_MALLOCMEMBPTR, MCUCFG_MALLOCMEMSIZE); \
OS_NOP(1); \
mSysTick_INIT(); \
mSysIRQ_Enable(); \
EA = 1; \
}while(false)
/* CosyOS低功耗 */
#define mCosyOS_IDLE() \
do{ \
PCON |= 0x01; \
OS_NOP(4); \
}while(false)
/* 中断挂起服务_FIFO */
#define mPendSV_FIFOLoad() \
do{ \
mPendSV_FIFOLoader(&u_psv); \
mPendSV_Set(); \
}while(false)
#define mPendSV_FIFOHandle() \
if(!m_sign_fifo_0_0) mPendSV_FIFOHandler()
/* 事件标志组-中断中写多标志位 */
#define miWriteFlagBits() \
if(!u_psv.value){ \
do{}while(false)
/* 任务栈 */
#define mTaskStack_INIT0() \
do{ \
*(s_u32_t *)node_news->bsp = ( \
((s_u16_t)s_task_starter->entry << 8) \
| ((s_u16_t)s_task_starter->entry >> 8) \
| ((s_u32_t)s_task_starter->entry & 0xFFFF0000) \
); \
*(s_u8_t *)(node_news->bsp + 42 - 5) = DPXL; \
*(s_u8_t *)(node_news->bsp + 42 - 1) = 0; \
mUserReg_INITa(); \
mUserReg_INITc(); \
}while(false)
#define mTaskStack_LEN()
/* MSP模式 */
#if (MCUCFG_TASKSTACK_MODE == __MSP__)
#define MCUCFG_TASKSTACK_REALLOC __ENABLED__
#define mTaskNode_Head_ m_stacksize_t stacklen;
#define mTaskStack_INIT() \
do{ \
mTaskStack_INIT0(); \
node_news->stacklen = MCUCFG_BASICSTACKSIZE; \
}while(false)
/* PSP模式 */
#elif (MCUCFG_TASKSTACK_MODE == __PSP__)
#define MCUCFG_TASKSTACK_REALLOC __DISABLED__
#define mTaskNode_Head_ m_sp_t psp;
#define mTaskStack_INIT() \
do{ \
mTaskStack_INIT0(); \
node_news->psp = (m_sp_t)node_news->bsp + MCUCFG_BASICSTACKSIZE - 1; \
}while(false)
#endif
/* 全局临界区 */
#define mxDisableIRQ() mx_disable_irq()
#define mxResumeIRQ() mx_resume_irq()
#endif

683
Port/80251/port_80251s.s Normal file

File diff suppressed because it is too large Load Diff