程序清单 L7.8 内存分配的例子——扫描模拟量的输入和报告出错 |
AnalogInputTask() |
{ |
for (;;) { |
for (所有的模拟量都有输入) { |
读入模拟量输入值; (1) |
if (模拟量超过阈值) { |
得到一个内存块; (2) |
得到当前系统时间 (以时钟节拍为单位); (3) |
将下列各项存入内存块: (4) |
系统时间 (时间戳); |
超过阈值的通道号; |
错误代码; |
错误等级; |
等. |
向错误队列发送错误消息; (5) |
(一个指向包含上述各项的内存块的指针) |
} |
} |
延时任务,直到要再次对模拟量进行采样时为止; |
} |
} |
|
|
|
ErrorHandlerTask() |
{ |
for (;;) { |
等待错误队列的消息; (6) |
(得到指向包含有关错误数据的内存块的指针) |
读入消息,并根据消息的内容执行相应的操作; (7) |
将内存块放回到相应的内存分区中; (8) |
} |
} |
程序清单 L7.9 等待从一个内存分区中分配内存块 |
OS_EVENT *SemaphorePtr; (1) |
OS_MEM *PartitionPtr; |
INT8U Partition[100][32]; |
OS_STK TaskStk[1000]; |
|
|
void main (void) |
{ |
INT8U err; |
|
OSInit(); (2) |
. |
. |
SemaphorePtr = OSSemCreate(100); (3) |
PartitionPtr = OSMemCreate(Partition, 100, 32, &err); (4) |
. |
OSTaskCreate(Task, (void *)0, &TaskStk[999], &err); (5) |
. |
OSStart(); (6) |
} |
void Task (void *pdata) |
{ |
INT8U err; |
INT8U *pblock; |
|
|
for (;;) { |
OSSemPend(SemaphorePtr, 0, &err); (7) |
pblock = OSMemGet(PartitionPtr, &err); (8) |
. |
. /* 使用内存块 */ |
. |
OSMemPut(PartitionPtr, pblock); (9) |
OSSemPost(SemaphorePtr); (10) |
} |
} |
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) | Powered by Discuz! 7.0.0 |