-
UCOSIII
任务堆栈:存储任务中的调
用的函数、局部变量、中断
服务程序和
CPU
< br>寄存器的值。
全局变量的保护:
1.
如果只在一个任务中写
(或只有一个数据)
,
而在其他
任务中只是读取,则可以不用互斥型信号量,最多会造
成读取的数据未被完全写完。
2.
如果全局变量在多个任务中写,
则需要用互斥型信号量
< br>保护,这样当有任务申请到互斥型信号量(保护不可重
入的程序段)写数据时,其
他任务的同一个互斥型信号
量必须等待上一个任务的释放才可进行写。
< br>
3.
如果全局变量在中断中写,
则在其他任务中的全局变量
的写操作要用临界段(禁止中断和禁止调度
:
保护不可被
分割的程序段)保护。(因为如果不关中
断相当于中断
的优先级最高,而且不能被像其他任务那样挂起。)
OS_CFG_ISR_POST_DEFERRED_EN
为
1
临界段使用锁
UCOSIII
调度器方式;为
0
< br>临界段使用禁中断方式
(
CPU_SR_ALLOC()
;
OS_CRITICAL_ENTER();OS_CRITICAL_EXIT();
OS_CRITICAL_EXIT_NO_SCHED();
OSSchedLockNestingCtr
记录调度器被锁的次数)。
检测任务堆栈的使用情况:
OS_C
FG_STAT_TASK_STK_CHK_EN
使能
OS_ERRerr;
CPU_STK_SIZE
stk_free;
CPU_STK_SIZE stk_used;
OSTaskStkChk(&TaskBStkTCB,&stk_free,&stk_use d,&e
rr);
中断中使用
OSI
ntEnter();
和
OSInt
Exit();
是为了退出中
断后执行中断调度操作,如果中断
中并未用到
OSSemPost();
等系统函数,则退出中断
服务程序后不需
要进行任务调度,就可以不在中断服务程序中使用
OSIntEnter();
和
OSIntExit();
。
UCOSIII
(有时候用:
CPU_CRITIC
AL_ENTER();OSIntNestingCtr++;
CPU_CRITI
CAL_EXIT();
替代
OSIntEnter();
p>
)
一、
变量类型
UCOSIII
在
cpu.h
中是有关
cpu
变
量的重新定义,
还包括
CPU_STK
(
CPU
堆栈类型),
和
CPU_STK_SIZE
(
CPU
堆栈类型的大小)的定义,
CPU_SR
(
CPU
状态寄存
器的定义)。
在
os.h
中是有关
os
类型的定义
如
OS_TCB
(
任务控制块)
、
OS_SEM
(信号量)、
OS_MUTEX
(互斥型信号量)、
OS_MSG<
/p>
(消息)、
OS_Q
(消息队列)、
p>
OS_ERR
(系
统错误)等。
在
cpu_core.h
中是有关
cpu
的定义,如
CPU_
ERR
、
CPU_TS
、
CPU_TS_TMR
等
CPU_STK
:
typedef
unsigned int
堆栈的类型定义
OS_TCB
:
struct
os_tcb
任务控制块的类型定义
OS_ERR
:
enumos_err
错误信息定义
CPU_TS
:
typedef
unsigned int
时间戳变量
CPU_TS_TMR
:
typedef unsigned
int
定时器变量
二、
全局变量
UCOSIII
(
OS_CFG_STAT_TASK_EN
使能且调用了
OSStatTaskCPUUsageInit(&err);
< br>则开启了统计任务
的功能:可以统计
< br>CPU
使用率等。)
OSStatTaskCPUUsage
:
C
PU
的使用率
(
0
—
10000=
0.00-100.00%
)
p>
OSStatTaskCPUUsageMax
:
< br>CPU
的使用率最大值
(
0
p>
—
10000=
0.00-100.00%
)
p>
OSTaskCtxSwCtr
:
任务切换
次数的记录变量
OSStatTa
skCtr
:
已经建立了的任务数
三、常用函数
一、
OS_CORE.C
UCOSIII
(
1
)
void OSInit()
//
系统初始化
(
< br>2
)
void OSIntEnter()
//
发生了一次中断(中断
嵌套的逐层进入)
< br>(
3
)
void
OSIntExit()
//
退出了一次中断(中断嵌
套的逐层退出)
(
4
)
void
OSSched()
//
系统进行调度
(
5
)
void OSSchedLock()
//
给调度器上锁
(
6
)
void
OSSchedUnlock()
//
给调度器解锁,成对使
用
(
7
)
void
OSStart()
//
启动多任务过程,在启动
之前必须调用
OSInit()
,并已建立一个任务。其中
OSStar
tHighRdy()
必须调用
OSTaskSwHook()
,
并令
OSRunning =
TRUE.
(
8
)
< br>void OS_Pend()
//
挂起任务
(
9
)
void
OS_Post()
//
解挂任务
(
10
)
void OS_PendAbort()
//
取消挂起任务
(
11
)
INT16UOSV
ersion ()
//
返回
u
c/os
的版本号
*10000
(<
/p>
12
)
void
OS_IdleTaskInit() //
空闲任务初始化
UCOSIII
(
13
)
void OS_IdleTask()
//
空闲任务
二、
OS_TASK.C
(
1
)
void
OSTaskCreate(OS_TCB
*p_tcb,//
任务控制
块
UCOSIII
CPU_CHAR
*p_name,//
任务名
OS_TASK_PTR
p_task,//
任务函数指针
void
*p_arg,//
任务函数参数
OS_PRIO
prio,//
任务优先级
CPU_STK
*p_stk_base,//
堆栈指针
CPU_STK_SIZE
stk_limit,//<
/p>
任务的堆栈
剩余警戒线
CPU_STK_SIZE
stk_size,//<
/p>
任务的空间
大小
OS_MSG_QTY
q_size,
//
能接收的信
息队列最大值
OS_TICK
time_quanta,//
时间片轮转时间
void
*p_ext,
//
任务控制块的扩展信息
OS_OPT
opt, //
任务的选项
OS_ERR
*p_err)
//
任务的错误信息
(
2
)
void
OSTaskChangePrio()
//
任务优先级别
的改变
(
3
)
void
OSTaskDel()
//
任务的删除
(
4
)
void
OSTaskSuspend()
//
任务的暂停
UCOSIII
(
5
)
p>
void OSTaskResume()
//
任务的恢复
(
< br>6
)
void OSTaskStkChk()
//
校核空余内存
的数量
(
7
)
OS_MSG_Q
TY OSTaskQFlush()
//
清空任务级消
息队列中的消息
(
8
)
void
*OSTaskQPend()
//
挂起任务级消息队列
(
9
)
CPU_BOOLEAN OSTaskQ
PendAbort()//
取消任务级
消息队列的挂起状态<
/p>
(
10
)
p>
void OSTaskQPost()
//
向任务级消息队
列中发送消息
<
/p>
(
11
)
OS_
REG OSTaskRegGet()
//
获取任务寄存器
的当前值
(
12
)
void
OSTaskRegSet()
//
设置任务寄存器
的当前值
(
13
)
OS_SEM_CTR OSTaskSemPend()
//
任务信号
量等待信号
(
14
)
CPU_BOOLEAN OSTaskSemPendAbort()/
/
任务信
号量取消挂起状态
-
-
-
-
-
-
-
-
-
上一篇:dsp流水灯
下一篇:ARM启动及工作模式切换.