mirror of
https://gitee.com/cosyos/cosyos.git
synced 2026-02-05 19:39:42 +08:00
249 lines
6.4 KiB
C
249 lines
6.4 KiB
C
/**************************************************************************//**
|
||
* @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
|