📄 os_cpu_c.c
字号:
#define IN_OS_CPU_C
//#include "config.h"
#include "../CONFIG/config.h"
#if EN_SP2 > 0
uint8 Sp2[Sp2Space]; // 高级中断堆栈
#endif
#if EN_OSStkChk>0
uint16 OS_Stk_Null=0xffff;
uint16 OS_Stk_Min_Null=0xffff;
#endif
//#if OS_MAX_TASKS < 9
//uint8 OSFastSwap = 0xff; // 任务是否可以快速切换
//#else
//uint16 OSFastSwap = 0xffff;
//#endif
#define STACK_END (uint8 *)&OS_STACK[0];
#define STACK_START (uint8 *)&OS_STACK[OS_STACK_SIZE-1];
uint8 OS_STACK[OS_STACK_SIZE];
uint8 * OSTaskStackBottom[OS_MAX_TASKS + 2];
void OSIdle(void)
{
while(1)
{
MCUCR &= ~((1 << SM0) | (1 << SM1) | (1 << SM2));
}
}
void OSStart(void)
{
uint8 *cp;
uint8 i,temp;
cp=STACK_START;
OSTaskStackBottom[0] = STACK_START;
OSTaskStackBottom[OS_MAX_TASKS + 1] =STACK_END;
/* 初始化优先级最高的任务堆栈,使返回地址为任务开始地址 */
*cp-- = (uint8)((uint16)TaskFuction[0]); //返回地址低8位
*cp-- = (uint8)((uint16)TaskFuction[0]>>8); //返回地址高8位
SP = (uint16) cp;
/* 初始化优先级最低的任务堆栈 */
cp = STACK_END;
for(temp=0;temp<OS_TASK_STACK_INIT_SIZE-2;temp++)
{
*(++cp) = 0;
}
*(++cp) = (uint8)((uint16)OSIdle>>8); // 返回地址高8位
*(++cp) = (uint8)((uint16)OSIdle); //返回地址低8位
OSTaskStackBottom[OS_MAX_TASKS] =(uint8 *)cp;
/* 初始化其它优先级的任务堆栈 */
for(i = OS_MAX_TASKS-1; i > 0; i--)
{
for(temp=0;temp<OS_TASK_STACK_INIT_SIZE-2;temp++)
{
*(++cp) = 0;
}
*(++cp) = (uint8)((uint16)TaskFuction[i]>>8); //返回地址高8位
*(++cp) = (uint8)((uint16)TaskFuction[i]); //返回地址低8位
OSTaskStackBottom[i] =(uint8 *)cp;
}
/* 允许中断 */
Os_Enter_Sum = 1;
OS_EXIT_CRITICAL();
/* 函数返回优先级最高的任务 */
ret();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -