uc/os--OSTaskStkInit

OSTaskStkInit函数用于初始化任务栈,参数包括任务入口、参数地址和栈顶地址。在函数中,栈被设置了一系列的寄存器值,包括任务地址、PSW、ACC、B、DPL、DPH等,并且任务参数ppdata通过R3、R2、R1寄存器传递,而不是使用虚拟堆栈。最后返回栈顶地址。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

OSTaskStkInit传入参数:任务的入口函数地址,函数所需要的参数地址,函数对应的栈地址

void *OSTaskStkInit (void (*task)(void *pd), void *ppdata, void *ptos, INT16U opt) reentrant
{
OS_STK *stk;

ppdata = ppdata;
opt = opt; //opt没被用到,保留此语句防止告警产生
stk = (OS_STK *)ptos; //用户堆栈最低有效地址
*stk++ = 15; //用户堆栈长度
*stk++ = (INT16U)task & 0xFF; //任务地址低8位
*stk++ = (INT16U)task >> 8; //任务地址高8位
*stk++ = 0x00; //PSW
*stk++ = 0x0A; //ACC
*stk++ = 0x0B; //B
*stk++ = 0x00; //DPL
*stk++ = 0x00; //DPH
*stk++ = 0x00; //R0
//R3、R2、R1用于传递任务参数ppdata,其中R3代表存储器类型,R2为高字节偏移,R1为低字节位移。
//通过分析KEIL汇编,了解到任务的void *ppdata参数恰好是用R3、R2、R1传递,不是通过虚拟堆栈。
*stk++ = (INT16U)ppdata & 0xFF; //R1 (9)
*stk++ = (INT16U)ppdata >> 8; //R2 (10)
*stk++ = 0x01; //R3 (11) XDATA,所以存储器类型固定为1,见C51.PDF第178页说明。

*stk++ = 0x04; //R4
*stk++ = 0x05; //R5
*stk++ = 0x06; //R6

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值