共2条
1/1 1 跳转至页
small,RTOS51 用过small RTOS51的大侠进来看看

问
由于small RTOS51不允许动态删除任务和建立任务,所有没有办法使任务复位,就是让任务重头开始运行.我根据small RTOS的初始化代码做了一个让任务复位的程序,但是不成功。麻烦大侠们帮忙看看,谢谢!
/***********************************************************
** 函数名称:OSTaskReset
** 功能描述:复位一个任务,让其重新开始执行
** 输入: 需要复位的任务ID
** 输出: 无
*************************************************************/
void OSTaskReset(uint8 TaskID)
{
uint8 idata *cp;
uint8 data i;
if(TaskID>OS_MAX_TASKS)
return;
cp = (uint8 idata *)(IDATA_RAM_SIZE - 1) ;
i = (OS_MAX_TASKS+1);
while(i > TaskID)
{
cp--;
cp--;
cp--;
i--;
}
*cp-- = 0;
*cp-- = ((uint16)(TaskFuction[TaskID])) / 256;
OSTsakStackBotton[TaskID] = cp;
*cp-- = ((uint16)(TaskFuction[TaskID])) % 256;
}
答 1: 乱搞 答 2: 恳请rtfsc指出那里不行小弟学艺不精,恳请rtfsc指出那里不行 答 3: 把程序修改了,欢迎拍砖!/***********************************************************
** 函数名称:OSTaskReset
** 功能描述:复位一个任务,让其重新开始执行
** 输入: 需要复位的任务ID
** 输出: 无
*************************************************************/
void OSTaskReset(uint8 TaskID)
{
uint8 idata *cp;
if(TaskID>OS_MAX_TASKS)
return;
cp=(uint8 idata *)OSTsakStackBotton[TaskID]; //获取任务TaskID的堆栈指针
if(OSFastSwap & OSMapTbl[TaskID])
{//上一次是通过OSSched()切换出去的
cp = cp - (uint8 idata *)6;
*cp-- = ((uint16)(TaskFuction[TaskID])) / 256;
*cp = ((uint16)(TaskFuction[TaskID])) % 256;
}
else
{ //上一次是通过中断切换出去的
cp = cp - (uint8 idata *)19;
*cp-- = ((uint16)(TaskFuction[TaskID])) / 256;
*cp = ((uint16)(TaskFuction[TaskID])) % 256;
}
}
还得说明一点,程序还是有问题,请大侠们多多指教! 答 4: 不要用了.难为51了. 答 5: 还是乱搞.不用改了,你离能改这个还差太远. 答 6: 改这个干吗啊要学就学实战的,os很多,熟悉主流,实用,稳定的比较好,能拿来就用就拿来就用,改东改西,会花很多不值得的时间, 答 7: 呵呵,成功了其实只要清楚small RTOS51的堆栈就可以了,现在运行起来没有什么后遗症! 答 8: 真佩服楼主.
/***********************************************************
** 函数名称:OSTaskReset
** 功能描述:复位一个任务,让其重新开始执行
** 输入: 需要复位的任务ID
** 输出: 无
*************************************************************/
void OSTaskReset(uint8 TaskID)
{
uint8 idata *cp;
uint8 data i;
if(TaskID>OS_MAX_TASKS)
return;
cp = (uint8 idata *)(IDATA_RAM_SIZE - 1) ;
i = (OS_MAX_TASKS+1);
while(i > TaskID)
{
cp--;
cp--;
cp--;
i--;
}
*cp-- = 0;
*cp-- = ((uint16)(TaskFuction[TaskID])) / 256;
OSTsakStackBotton[TaskID] = cp;
*cp-- = ((uint16)(TaskFuction[TaskID])) % 256;
}
答 1: 乱搞 答 2: 恳请rtfsc指出那里不行小弟学艺不精,恳请rtfsc指出那里不行 答 3: 把程序修改了,欢迎拍砖!/***********************************************************
** 函数名称:OSTaskReset
** 功能描述:复位一个任务,让其重新开始执行
** 输入: 需要复位的任务ID
** 输出: 无
*************************************************************/
void OSTaskReset(uint8 TaskID)
{
uint8 idata *cp;
if(TaskID>OS_MAX_TASKS)
return;
cp=(uint8 idata *)OSTsakStackBotton[TaskID]; //获取任务TaskID的堆栈指针
if(OSFastSwap & OSMapTbl[TaskID])
{//上一次是通过OSSched()切换出去的
cp = cp - (uint8 idata *)6;
*cp-- = ((uint16)(TaskFuction[TaskID])) / 256;
*cp = ((uint16)(TaskFuction[TaskID])) % 256;
}
else
{ //上一次是通过中断切换出去的
cp = cp - (uint8 idata *)19;
*cp-- = ((uint16)(TaskFuction[TaskID])) / 256;
*cp = ((uint16)(TaskFuction[TaskID])) % 256;
}
}
还得说明一点,程序还是有问题,请大侠们多多指教! 答 4: 不要用了.难为51了. 答 5: 还是乱搞.不用改了,你离能改这个还差太远. 答 6: 改这个干吗啊要学就学实战的,os很多,熟悉主流,实用,稳定的比较好,能拿来就用就拿来就用,改东改西,会花很多不值得的时间, 答 7: 呵呵,成功了其实只要清楚small RTOS51的堆栈就可以了,现在运行起来没有什么后遗症! 答 8: 真佩服楼主.
共2条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【EEPW电子工程师创研计划】技术变现通道已开启~ | |
发原创文章 【每月瓜分千元赏金 凭实力攒钱买好礼~】 | |
【EEPW在线】E起听工程师的声音! | |
“我踩过的那些坑”主题活动——第001期 | |
高校联络员开始招募啦!有惊喜!! | |
【工程师专属福利】每天30秒,积分轻松拿!EEPW宠粉打卡计划启动! | |
送您一块开发板,2025年“我要开发板活动”又开始了! | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
【我踩过的那些坑】STM32的硬件通讯调试过程的“坑”被打赏50分 | |
【我踩过的那些坑】晶振使用的问题被打赏100分 | |
【我踩过的那些坑】电感选型错误导致的处理器连接不上被打赏50分 | |
【我踩过的那些坑】工作那些年踩过的记忆深刻的坑被打赏10分 | |
【我踩过的那些坑】DRC使用位置错误导致的问题被打赏100分 | |
我踩过的那些坑之混合OTL功放与落地音箱被打赏50分 | |
汽车电子中巡航控制系统的使用被打赏10分 | |
【我踩过的那些坑】工作那些年踩过的记忆深刻的坑被打赏100分 | |
分享汽车电子中巡航控制系统知识被打赏10分 | |
分享安全气囊系统的检修注意事项被打赏10分 |