-
任务管理
1
OSTaskCreate()
建立一个
新任务。
任务的建立可以在多任务环境启动之前,
也可以在
p>
正在运行的任务中建立。
中断处理程序中不能建立任务。
一个任务可
以
为
无
限
循
环
的
结
构
。
函
数
原
型
:
INT8U OSTaskCreate(void (*task)(void *pd), void *pdata, OS_STK *pto
s, INT8U prio);
参
数
说
明
:
task
是
指
向
任
务
代
码
首
地
址
的
指
针。
pdata
指向一个数据结构,该结构用来在建立任务时向任务传
递
参
数。
ptos is a
pointer to the task's top of stack. If the
configuration con
stant OS_STK_GROWTH is
set to 1, the stack is assumed to grow
down
ward (i.e. from high memory to low
memory). 'pstk' will thus point to the
highest (valid) memory location of the
stack. If OS_STK_GROWTH is s
et to 0,
'pstk' will point to the lowest memory location of
the stack and the
stack will grow with
increasing memory locations. prio is the
task's pr
iority. A unique priority MUST
be assigned to each task and the lower
the
number, the higher the
priority.
返回值:
OSTaskCreate()
的返回值为下
述之一:
*
OS_NO_ERR
:函数调用成功。
* OS_PRIO_E
XIST
:具有
该优先级的任务已经存在。
* OS_PRIO_INV
ALID
:参数指定的优先<
/p>
级大于
OS_LOWEST_PRIO
。
* OS_NO_MORE_TCB
:系统中没有
OS_TCB
可以分配给任务了。
2 OSTaskSuspend()
p>
无条件挂起一个任务。
调用此函数的任务也可
以传递参数
OS_PRIO_SELF
,挂起调用任务本身
。当前任务挂起后,
1
只有其他任务才能唤醒被挂起的任务。
任务挂起后,
系统会重新进行
任务调度,
运行下一个优先级最高的就绪任
务。
唤醒挂起任务需要调
用函数
OST
askResume()
。
< br>任务的挂起是可以叠加到其他操作上
的。例如,任务被挂起时正在进行延时操作,
那么任务的唤醒就需要
两个条件:延时的结束以及其他任务的唤醒操作。又如,任务被挂
起
时正在等待信号量,
当任务从信号量的等待对列中清除后也不
能立即
运
行
,
而
必
须
等
到<
/p>
被
唤
醒
后
。
函
数
原
型
:
INT8U
OSTaskSuspend(INT8U prio);
参数说明:
< br>prio
为指定要获取挂
起的任务优先级,也可以指定参
数
OS_PRIO_SELF
,挂起任务本身。
此
时
,
下
< br>一
个
优
先
级
最
高
的
就
绪
任
务
将
p>
运
行
。
返
回
值
:
OSTaskS
uspend()
的返回值为下述之一:
* OS_NO_E
RR
:函数调用成
功。
* OS_TA
SK_SUSPEND_IDLE
:
试图挂起
< br>μC/OS
-II
中的空闲任务
(
Idle
task
)
。此为非法操作。
* OS
_PRIO_INV
ALID
:参数指定的优
< br>先级大于
OS_LOWEST_PRIO
或没有设定
OS_PRIO_SELF
的值。
* OS_TASK_SUSPEND_PRIO
:要挂起的任务不存在。
3 OSTaskResume()
唤醒一个用
OSTaskSuspend()
函数挂起的任
务。
OSTaskResume()
也是唯一能
“
解挂
”
挂起任务的函数。函数原型:
INT8U
OSTaskResume(INT8U prio);
参数说明:
prio
指定要唤醒任务的
优
先<
/p>
级
。
返
回
值
:
OSTaskResume()
的
返
回
值
为
下
述
之
一
:
*
OS_NO_ERR
:函数调用成功。
* OS_TASK_R
ESUME_PRIO
:要唤
醒的任务不存在。
* OS_TASK_NOT_SUSPENDED
:要唤醒的任务不
在挂起状态。
* OS_PRIO_INV
AL
ID
:参数指定的优先级大于或等于
2
OS_LOWEST_PRIO
。信号量
1 OSSemCreate()
该函数建立并初
始化一个信号量,信号量的作用如下:
*
允许一个任务和其他任务
或者中断同步
*
取得设备的使用权
*
标志事件的发生函数原型:
OS_EVENT
*OSSemCreate(INT16U
value);
参数说明:
value
参数是所
建立的信号量的初始值,可以取
0
< br>到
65535
之间的任何值。返回值:
< br>OSSemCreate()
函数返回指向分配给所建立的信号量的控制块的指
针。如果没有可用的控制块,
OSSemCreate()
函数返回空指针。
2 OSSemPend()
该函数用于任务
试图取得设备的使用权、任务需
要和其他任务或中断同步、
任务
需要等待特定事件的发生的场合。
如
果
任
务
调
用
OS
SemPend()
函
数
时
,
信
号
量
的
值
大
于
< br>零
,
OSSemPend()
函数递减该值并返回该值。如果调用时信号量值等于
零
,
OSSemPend()
函
数
将
任
务
加
< br>入
该
信
号
量
的
等
待
队
列
。
OSSemPend()
函数挂起当前任务直到其他的任务或中断设置信号量
或超出等待的预期
时间。如果在预期的时钟节拍内信号量被设置,
μC/OS
-<
/p>
Ⅱ默认让最高优先级的任务取得信号量并回到就绪状态。
一个
p>
被
OSTaskSuspend()
函数
挂起的任务也可以接受信号量,但这个任务
将一直保持挂起状态直到通过调用
OSTaskResume()
函数恢复该任务
的
运
行
。
函<
/p>
数
原
型
:
void OSSemPend ( OS_EVNNT *pevent, INT16U
timeout, int8u *err
);
参数说明:
pevent
是指向
信号量的指针。
该指针的值在建立该信号量
时可以得到。
(参考
OSSemCreate()
函数)
。
timeout
允许一个任
务在经过了指定数目的时钟节拍后
还没有得到需要的信号量时恢复
3
就绪状态。
如果该值为零表示任务将持续地等待信号量,
最大的等待
时间为
65535
个时钟节拍。
这个时间长度并不是非常严格的,
可能存
在一个时钟节拍的误差。
err
是指向包含错误码的变量的指针,
返回的错误码可能为下述几种:
* OS_NO_ERR
:信号量不为
零。
* OS_TIMEOUT
:信号量没有在指定数目的时钟周期内
被设置。
* OS_ERR_PEND_ISR
:从中断调用该函数。虽然规
定了不允许从中断调用该函数,但
μC/OS
-
Ⅱ仍然包含了检测这种情
况的功能。
*
OS_ERR_EVENT_TYPE
:
pevent
不是指向信号
量的指针。返回值:无
3
OSSemPost()
该函数用于设置指定的信
号量。如果指定的信号量是零或大于零,
OSSemPost()
函数递增该信
号量的值并返回。
如果有任何任务在等待
该信号量,
则最高优先级的
任务将得到信号量并进入就绪状态。
任务调度函数将进行任务调度,
决定当前运行的任务是否仍然为最高优先级的就绪任务。
函数原型:
INT8U
OSSemPost
(
OS_EVENT *pevent
p>
)
;
参数说明:
p
event
是指向
信号量的指针。该指针的值在建立该信号量
时可以得到。
(参考
OSSemCreate()
函数)
。返回值:
OSSemPost()
函数的返回值为下述之
一:
*
OS_NO_ERR
:信号量被成功地设置
*
OS_SEM_OVF
:信号量
的值溢出
*
OS_ERR_EVENT_TYPE
:
pevent
不是指向信号量的指针
时间
1
OSTimeDly()
该函数用于将一个任务延时若干个时钟节
p>
拍。如果延时时间大于
0
,系统将立即进行
任务调度。延时时间的长
度可从
0
到<
/p>
65535
个时钟节拍。
延时时间
0
表示不进行延时,
函数将
< br>立即返回调用者。
延时的具体时间依赖于系统每秒钟有多少个时钟节
4
拍(由文件
OS_CFG
.H
中的
OS_TICKS_PER_SEC
宏来设定)
。函数
原型:
void OSTimeDly (INT16U
ticks);
参数说明:
ticks
为要延时的时
钟节拍数。返回值:无
2
OSTimeDlyHMSM()
该函数用于将一个
< br>任
务
延
时
若
干
时
间
。
延
时
的
单
p>
位
是
小
时
、
分
、
秒
、
毫
秒
。
< br>调
用
OSTimeDlyHMSM()
后,如果延时时间不为
0
,系统将立即进行任
务
调
度
。
函
数
原
型
: INT8U OSTimeDlyHMSM (INT8U
hours
,
INT8U
minutes
,
INT8U
seconds
,
INT16U
milli);
参数说明:
hours
为
延时小时数,范围从
0-255
。
minutes
为延时分钟数,范围从<
/p>
0-59
。
seconds
为延时秒数,
范围从
0-59
milli
为延时毫秒数,
范围从
0
-999
。
需要说明
的是,操作系统在处理延时操作时都是
以时钟节拍为单位的,
实
际的延时时间是时钟节拍的整数倍。
如果系
统时钟节拍的间隔是
10ms
,而设定延时为
5ms
的话,则不会产生延
时操作;而如果设定延时为
15ms
,则实际的延时是两个时钟节拍,
也就是
20ms
。返回值:
OSTimeDlyHMSM
()
的返回值为下述之一:
*
OS_NO_ERR
:函数调用成功。
* OS_TIME_I
NV
ALID_MINUTES
:
参数
错误,分钟数大于
59
。
* OS_T
IME_INV
ALID_SECONDS
:参数
错误,秒数大于
59
。
*
OS_TIME_INV
ALID_MILLI
:参数错误,毫
秒
数大于
999
。
* OS_TIME_ZERO_DLY
:四个参数全为
0
。内存管理
1 OSMemCreate()
该函数建立并初始化一个用于动态内存分配的
区域,该内存区域
包含指定数目的、大小确定的内存块。应用可以动
态申请这些内存块并在用完后将其释放
回这个内存区域。
该函数的返
回值就是指向这个内存区域控制块
的指针,并作为
OSMemGet()
,
5
OSMemPut()
p>
,
OSMemQuery()
等
相
关
调
用
的
参
数
。
< br>函
数
原
型
:
OS_MEM *OSMemCreate( void *addr,
INT32U nblks, INT32U blksize,
INT8U
*err );
参数说明:
addr
建立的内存区域的起始地址。可以使用
静态数组或在系统初始化时使用
< br> malloc()
函数来分配这个区域的空
间。
nblks
内存块的数目。每一个内存区域最少需要定义两个内
存块。
blksize
每个内存块的大
小,最小应该能够容纳一个指针
变量。
err
是指向包含错误码的变量的指针。
Err
可能是如下几种
情
况
:
p>
* OS_NO_ERR
:
成
功
建
立
< br>内
存
区
域。
* OS_MEM_INV
ALID_ADDR
:非法地址,即地址为空指
针
。
* OS_MEM_INV
ALID_PART
p>
:
没
有
空
闲
的
内
存
区
域。
*
OS_MEM_INV
ALID_BLKS
:没有为内存区域
建立至少
两个内存块。
*
OS_MEM_INV
ALID_SIZE
:
内存块大小不足以
容纳一个指针变量。
返回值:
OSMemCreate()
函数返回指向所创建的
内
存
区
域
控
制
块
的
指
针
。
如
果<
/p>
创
建
失
败
,
函
数
返
回
空
指
针
。
2 OSMemGet()
该函数
用于从内存区域分配一个内存块。用户程
序必须知道所建立的内存块的大小,并必须在使
用完内存块后释放
它。
可以多次调用
OSMemGet()
函数。
它的返回值就是指向所分配内<
/p>
存
块
的
指
针
,
并
作
为
OSMemPut()
函
< br>数
的
参
数
。
函
数
原
型
:
void *OSMemGet(OS_MEM
*pmem, INT8U *err);
参数说明:
pmem
是
指向内存区域控制块的指针,可以从
OSMemCreate()
函数的返回值
中得到。
err
是指向包含错误码的变量的指针。
Err
可能是如下情
况
:
* OS_NO_ERR
:
成
功
p>
得
到
一
个
内
存
6
-
-
-
-
-
-
-
-
-
上一篇:HTRI 学习笔记学习资料
下一篇:染字开头的成语