陈计明写的《嵌入式实时操作系统small rtos51原理及应用》书中OSQPend()函数不是很理解,求大神解答

#ifOS_MAX_TASKS<9//把当前任务加入到此消息队//列的等待任务表中Buf[3]=OSMapTbl[OSRunnmgTasklD()];(5)#elseif... #if OS_MAX_TASKS<9 //把当前任务加入到此消息队
//列的等待任务表中
Buf[3]=OSMapTbl[OSRunnmgTasklD()]; (5)
#else
if(OSRunningTasklD()<8){ (6)
Buf[3]=OSMap Tbl[OSRunningTasklD()]; (7)
else{
Buf[4] |= OSMapTbl[OSRunningTasklD( ) &()x07]; (8)
}
#endif
while(Buf[O]==0) //消息队列中暂时投有消息 (9)
{
#ifdef_C51_
SP=SP+sizeof(Buf)。 (10)
*((uint8 0S_Q_MEM_SEL * data*)(SP+l-slzeof(Buf))=Buf; (11)
#endif{
OSClearSignal(OSRunningTask()); //当前任务进入休眠
//状态 (12)
OSSched(); //调度下一个最高优先级的就绪任务运行(13)
#ifdef_C51_
Buf= *((uint8 OS_Q_MEM SEL*dota*)(SP+1-sizeof(Buf)); (14)
SP=SP-sizeof(Buf); (15)
#endif
if(OSWaitTick[OSRunningTasklD()]==O)(16)
{
break; //任务再次运行,如果超时到,退出循环
}
} //while(Buf[0]==O)
第(10)(11)(14)(15)语句不是很理解,堆栈指针sp是如何变化的?(uint8 0S_Q_MEM_SEL * data*)是什么意思?sizeof(Buf)这个是指数组buf[]的大小还是指 指针buf所指向数组的第一个数的大小?
展开
 我来答
追悔七年
2014-04-10 · TA获得超过587个赞
知道小有建树答主
回答量:251
采纳率:66%
帮助的人:254万
展开全部
第10句是在栈中分配临时变量,第11句是在指针强转,给分配的变量赋值,第14句从变量是读取数据,第15句还原栈指针.
sizeof(Buf)的值,要看Buf是怎么定义的,如果是定义的一个指针,那sizeof(Buf)就等于4(32位机)或2(8位机),如果定义的是数组,就是数组大小.
其实,如果你写过windows程序,就应该知道,VC的程序在进函数的时候一般都是下面的样子:

push EBP
mov EBP, ESP
add ESP xxx
和你贴的程序是一个意思
更多追问追答
追问
第11句是*(SP+l)=Buf,然而第14句是Buf= *(SP+1-sizeof(Buf)),为什么第14句要多减去sizeof(Buf)?
追答
*((uint8 0S_Q_MEM_SEL * data*)(SP+1-sizeof(Buf))=Buf; (11)
Buf= *((uint8 OS_Q_MEM SEL*dota*)(SP+1-sizeof(Buf)); (14)

这两句就是左右交换了下而以,没有多减去什么.


另外不知道你的代码哪儿来的,全是乱码,太坑爹.

wugexing
2014-04-10
知道答主
回答量:1
采纳率:0%
帮助的人:1326
展开全部
我是大神,但是我不会,你叫我回答个毛啊 。
追问
坑爹
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式