#include "def.h"
#include "OS.H"
//********************************************************************************
volatile PointType CToAsmSP; //C/ASM传SP用
volatile U8 OS_TaskRunning; //当前正在运行的Task
volatile U8 CallTkSwCount=0x0; //进入任务切换令牌
volatile U32 OSTimerCount=0; //系统时钟
volatile U32 MUX=0; //互斥
volatile U8 TmpHpTk=OS_TaskNum-1; //临时最高优先级任务
U32 FIQLR,SVCLR,FIQSPSR;
//任务控制块
struct{
PointType OSTaskStackTop; //保存任务的堆栈顶
PointType OSTaskStackBottom; //堆栈空间底
U32 OSTaskStackNum; //堆栈占据的基本块数
U32 OSWaitTick; //任务延时时钟
U32 OSTaskState; //任务状态
U32 OSUSRTaskID; //用户任务ID&系统任务ID
} TCB[OS_TaskNum];
/****************************************************************************
调度
****************************************************************************/
void TkSw(void)
{
OS_ENTER_CRITICAL();
if(CallTkSwCount==0x0){AsmTkSw();}
}
/****************************************************************************
功能描述:时间片处理
****************************************************************************/
void OSTimer(void)
{
U8 i;
OSTimerCount++;
CallTkSwCount++;
for(i=0;i<OS_TaskNum;i++){
if(TCB[i].OSTaskState!=0 && TCB[i].OSTaskState!=3){ //判断任务是否已经结束或挂起
if(TCB[i].OSWaitTick>1) TCB[i].OSWaitTick--; //给等待的任务减去1个等待时间片
else TCB[i].OSTaskState=1; //如果任务等时间到,设为就绪态
}
}
IsrHook(); //用户中断处理
}
/****************************************************************************
IO调度
****************************************************************************/
/****************************************************************************
MSG调度
****************************************************************************/
/****************************************************************************
CPU调度
功能描述:进行任务调度_C;
因为操作了SP,所以关键在禁止多次进入本函数
****************************************************************************/
void CtrTaskkSw(void)
{
U8 i;
CallTkSwCount++; //任务级切换标记为禁止,本程序未执行完前不会再执行本程序
TCB[OS_TaskRunning].OSTaskStackTop=CToAsmSP; //将正在运行的任务的堆栈底保存
#if OS_CORF>0 //内核形式,>0抢先式,0循环式
for(i=0;i<OS_TaskNum;i++){if(TCB[i].OSTaskState==1) goto sc;}
#else
for(i=OS_TaskRunning+1;i<OS_TaskNum;i++){if(TCB[i].OSTaskState==1) goto sc;} //如果新任务不是就绪态,下一任务
for(i=0;i<OS_TaskRunning;i++){if(TCB[i].OSTaskState==1) goto sc;}
#endif
i=OS_TaskNum-1;
sc:
if(TmpHpTk!=OS_TaskNum-1){ //让临时最高优先级任务首先运行,实时任务
OS_TaskRunning=TmpHpTk; //主要用来快速响应中断下部
TmpHpTk=OS_TaskNum-1;
}
else {OS_TaskRunning=i;}
CToAsmSP=TCB[OS_TaskRunning].OSTaskStackTop; //设置将要运行的任务
CallTkSwCount=0;
}
/*******************************************************************************
功能描述:建立一个新任务;
IN: void (*Task)(void) 任务函数名称;USRTaskID 用户定义任务号
OUT:0成功;1 USRTaskID过大;2 任务已存在;3 堆栈溢出,任务太多
********************************************************************************/
extern void GETSP(void);
U8 OSCreateTask(void (*Task)(void),U8 USRTaskID,U32 TaskStackNum)
{
static PointType StackPTR=0;
if(StackPTR==0){
GETSP();
StackPTR=CToAsmSP-0x1000;
}
if(USRTaskID>=OS_TaskNum){return 1;}
OS_ENTER_CRITICAL();
if(TCB[USRTaskID].OSTaskState!=0) {
OS_EXIT_CRITICAL();
return 2;
}
if(StackPTR>0){
TCB[USRTaskID].OSTaskStackTop=StackPTR;
TCB[USRTaskID].OSTaskStackBottom=StackPTR-TaskStackNum*OS_StackUnit*sizeof(PointType);
StackPTR-=TaskStackNum*OS_StackUnit*sizeof(PointType);
}
else {
OS_EXIT_CRITICAL();
return 3;
}
//栈初始化
*(PointType *)(TCB[USRTaskID].OSTaskStackTop)=(PointType)Task; //ARM R15 将任务的地址(PC)压入堆栈
*(--(PointType *)TCB[USRTaskID].OSTaskStackTop)=(PointType)Task; //ARM R14 LR
*(--(PointType *)TCB[USRTaskID].OSTaskStackTop)=0x0; //ARM R12
*(--(PointType *)TCB[USRTaskID].OSTaskStackTop)=0x0; //ARM R11
*(--(PointType *)TCB[USRTaskID].OSTaskStackTop)=0x0; //ARM R10
*(--(PointType *)TCB[USRTaskID].OSTaskStackTop)=0x0; //ARM R09
*(--(PointType *)TCB[USRTaskID].OSTaskStackTop)=0x0; //ARM R08
*(--(PointType *)TCB[USRTaskID].OSTaskStackTop)=0x0; //ARM R07
*(--(PointType *)TCB[USRTaskID].OSTaskStackTop)=0x0; //ARM R06
*(--(PointType *)TCB[USRTaskID].OSTaskStackTop)=0x0; //ARM R05
*(--(PointType *)TCB[USRTaskID].OSTaskStackTop)=0x0; //ARM R04
*(--(PointType *)TCB[USRTaskID].OSTaskStackTop)=0x0; //ARM R03
*(--(PointType *)TCB[USRTaskID].OSTaskStackTop)=0x0; //ARM R02
*(--(PointType *)TCB[USRTaskID].OSTaskStackTop)=0x0; //ARM R01
*(--(PointType *)TCB[USRTaskID].OSTaskStackTop)=0x0; //ARM R00
*(--(PointType *)TCB[USRTaskID].OSTaskStackTop)=(SVCMODE|NOINT); //ARM SPSR
//任务控制块初始化
TCB[USRTaskID].OSTaskStackNum=TaskStackNum; //保存任务堆栈基本块数
TCB[USRTaskID].OSUSRTaskID=USRTaskID; //保存任务自身ID和用户设定ID
TCB[USRTaskID].OSTaskState=1; //任务运行=1,等待=2,挂起=3,结束=0,
TCB[USRTaskID].OSWaitTick=0; //任务等待多少个调度周期,0不等待
OS_EXIT_CRITICAL();
return 0;
}
/*******************************************************************************
功能描述:OS初始化;
********************************************************************************/
void OSInit(void)
{
U8 i;
OS_ENTER_CRITICAL();
for(i=0;i<OS_TaskNum;i++){
TCB[i].OSTaskState=0;
TCB[i].OSTaskStackTop=0;
TCB[i].OSTaskStackNum=0;
}
OSCreateTask(OSIdle,OS_TaskNum-1,0x2000);
}
/*******************************************************************************
功能描述:第一次开始任务;
注:从最低优先级(Task0)的任务的开始
********************************************************************************/
void OSStartTask(void)
{
OS_ENTER_CRITICAL();
OS_TaskRunning=0;
CToAsmSP=TCB[OS_TaskRunning].OSTaskStackTop;
StartHT(); //开始第一个任务
}
/*******************************************************************************
功能描述:延时关挂起任务;
IN:ticks 系统时钟片
OUT:无
********************************************************************************/
void OSDelay(U32 ticks)
{
if(ticks>0){ //当延时有效
OS_ENTER_CRITICAL();
TCB[OS_TaskRunning].OSTaskState=2;
TCB[OS_TaskRunning].OSWaitTick=ticks;
TkSw(); //从新调度
}
}
/*******************************************************************************
功能描述:删除任务;
输入:UsrTaskID 用户定义任务ID号
输出:1设置成功;0失败
*******************************************************************************/
U8 OSDelTask(U8 UsrTaskID)
{
OS_ENTER_CRITICAL();
TCB[UsrTaskID].OSTaskState=0;
if(UsrTaskID==OS_TaskRunning) {TkSw();} //将自已Del
else {
OS_EXIT_CRITICAL();
return 1;
}
return 0;
}
/******************************************************************************
功能描述:任务休眠
输入:UsrTaskID 用户定义任务ID号,TaskSleepTicks 休眠的时间片
输出:1 设置成功;0失败
注:如果TaskSleepTicks设为0,将唤醒Task
*******************************************************************************/
U8 OSSleepTask(U8 UsrTaskID,U32 TaskSleepTicks)
{
OS_ENTER_CRITICAL();
if(TaskSleepTicks>0){
TCB[UsrTaskID].OSTaskState=2;
TCB[UsrTaskID].OSWaitTick=TaskSleepTicks;
OS_EXIT_CRITICAL();
return 1;
}
OS_E
没有合适的资源?快使用搜索试试~ 我知道了~
C语言和汇编写的ARM多任务内核程序
![preview](https://csdnimg.cn/release/downloadcmsfe/public/img/white-bg.ca8570fa.png)
共6个文件
h:3个
c:2个
s:1个
![preview-icon](https://csdnimg.cn/release/downloadcmsfe/public/img/scale.ab9e0183.png)
需积分: 15 9 下载量 145 浏览量
2009-02-07
09:38:29
上传
评论
收藏 5KB RAR 举报
温馨提示
一个ARM的多任务调度内核,有调度和时间服务功能,也有简单的互斥。
资源推荐
资源详情
资源评论
![C](https://img-home.csdnimg.cn/images/20210720083646.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![application/msword](https://img-home.csdnimg.cn/images/20210720083327.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083646.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![application/x-zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![text/plain](https://img-home.csdnimg.cn/images/20210720083646.png)
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![application/x-zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![application/msword](https://img-home.csdnimg.cn/images/20210720083327.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
收起资源包目录
![package](https://csdnimg.cn/release/downloadcmsfe/public/img/package.f3fc750b.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
共 6 条
- 1
资源评论
![avatar-default](https://csdnimg.cn/release/downloadcmsfe/public/img/lazyLogo2.1882d7f4.png)
![avatar](https://profile-avatar.csdnimg.cn/default.jpg!1)
scyszj
- 粉丝: 1
- 资源: 3
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![voice](https://csdnimg.cn/release/downloadcmsfe/public/img/voice.245cc511.png)
![center-task](https://csdnimg.cn/release/downloadcmsfe/public/img/center-task.c2eda91a.png)
安全验证
文档复制为VIP权益,开通VIP直接复制
![dialog-icon](https://csdnimg.cn/release/downloadcmsfe/public/img/green-success.6a4acb44.png)