Files
cosyos/Port/80251/port_80251.h
零中断延迟的RTOS ca65cdc039 update 移植文件.
Signed-off-by: 零中断延迟的RTOS <cosyos@139.com>
2026-01-13 09:27:48 +00:00

249 lines
6.4 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**************************************************************************//**
* @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