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