📄 os_cpu_c.c
字号:
/**********************************************************************************************************
* uC/OS-II
* 实时内核
*
* (c) Copyright 1992-1998, Jean J. Labrosse, Plantation, FL
* 版权所有
*
* unSP 专用代码
*
* 文件名 : OS_CPU_C.C
* 作者 : Jean J. Labrosse
* 改编 : 牟联树 lianshu@sunnorth.com.cn 北京北阳电子技术有限公司
**********************************************************************************************************/
#define OS_CPU_GLOBALS
#include "UCOS-II\unSP\includes.h"
/**********************************************************************************************************
* 初始化任务堆栈
*
* 描述 : 这个函数被OSTaskCreate()或OSTaskCreateExt()调用,以便初始化新创建任务的堆栈结构。本函数
* 与处理器高度相关。
*
* 参数 : task 指向任务代码的指针
*
* pdata 当任务第一次执行时将要传入任务的用户数据结构指针
*
* ptos 栈顶指针。ptos指针被默认为用户堆栈入口指针。如果OS_STK_GROWTH被置1,那么,
* ptos指向用户堆栈的最高有效地址。同样地,如果OS_STK_GROWTH清0,ptos将指向
* 用户堆栈的最低有效地址。
*
* opt 指定可以改变OSTaskStkInit()行为的选项。(见uCOS_II.H for OS_TASK_OPT_???)。
*
* 返回值 : 我修改了原来的程序,使函数总是返回用户堆栈空间的最低有效地址。这样修改提高了TCB换入换出
* 的效率。
*
* 注意 : 任务堆栈结构:
*
* ---------- -
* 用户栈最高地址---->| | |
* ---------- |
* | ... | 仿真堆栈空间
*---------- ---------- | 每任务一个
*|OSTCBCur| ?C_XBP---->| | | KEIL自动处理
*---------- ---------- -
* | |空闲间隔|
* | ----------------------- ---------- ----------
* \---->|OSTCBCur->OSTCBStkPtr| |?C_XBP低| SP---->| |
* ----------------------- ---------- ----------
* | |?C_XBP高| | |
* | ---------- - ----------
* | | | | | . |
* | ---------- | | . |
* | | | | | . |
* | ---------- | ----------
* | | . |长度 | | +1
* | | . | | ----------
* | | . | | OSStack---->| | 0
* | ---------- | ----------
* | | | | OSStkStart---->| 不关心 | -1 低地址
* | ---------- - ----------
* \------------->| 长度 | 低地址 系统硬件堆栈
* ----------
* 用户堆栈 长度=SP-OSStkStart
**********************************************************************************************************/
OS_STK *OSTaskStkInit(void (*task)(void *pd), void *pdata, OS_STK *ptos, INT16U opt)
{
OS_STK *stk;
pdata = pdata;
opt = opt; //opt没被用到,保留此语句防止告警产生
stk = (OS_STK *)ptos; //用户堆栈最高有效地址
*stk-- = 10; //用户堆栈长度
*stk-- = (INT16U)pdata;
// *stk-- = (INT16U) (ptos - TaskStkSize);
*stk-- = *((INT16U *)task + 1); //任务地址
*stk-- = 0x0000;
*stk-- = 0x5555; //r5
*stk-- = 0x4444; //r4
*stk-- = 0x3333; //r3
*stk-- = 0x2222; //r2
*stk-- = 0x1111; //r1
return ((void *)ptos);
}
//目标板初始化
void Sys_Init(void)
{
//PLLCON = 0x80;
}
//初始化比较定时器CMT0
void InitCMT0(void)
{
P_CMT0_TPR->W = 0xEA60; //定义Tick=200次/秒(即0.005秒/次)
P_CMT_Ctrl->W &= 0xff00;
P_CMT_Ctrl->W |= 0x0041; //允许CMT0中断,时钟为 CPUCLK/2
P_CMT_Start->W |= 0x0001; //启动定时器CMT0
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -