完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
在研究多任务操作系统时候,遇到了一个很瓶颈的问题:如何任务切换的时候,C语言是怎么指定程序进入指定的用户程序的?(即编写的多任务死循环函数)
基于以上问题,在通过查找资料,意外发现。OS设计的时候,需要把任务函数地址入栈,那么这个目的是什么呢??看如下网址: https://zhidao.baidu.com/question/537673906.html 这种方法是通过把函数地址入栈,然后再 RET 便可以跳到 入栈的函数地址执行函数。代码如下: MOV DPTR,#DELAY ;DELAY是函数名,DPTR是一个16为的数据指针,而函数名是16位的 ;DEC SP ;网址里的哥们是要把SP减2,我也不知道原因,我没减也没问题 ;DEC SP PUSH DPL ;先把函数低地址入栈,再高位入栈,51堆栈是8位储存方式 PUSH DPH RET ;退出指令 我们分析上面指令, 首先总体思路是:把函数地址入栈,然后调用RET指令,此时,会返回堆栈里储存的PC指针,当然就是我们入栈的函数地址了,这就是堆栈里保存的PC指针。 以上这种方法,就是通过堆栈来改变程序入口地址的方法。UCOS II 、RTX、FREERTOS实时操作系统猜测也是用这种方法,因为他们也要把函数地址入栈。(研究了几天这些源代码,看得懵懵懂懂,不是非常确定)。 另外,附纯汇编的调试源代码,验证这种方法。(LZ已验证) 闪烁灯_汇编.rar (17.82 KB ) |
|
相关推荐
5个回答
|
|
好吧。我也只是想让不知道的人知道。
|
|
|
|
你的现在这个操作方法,可能只可以等效于汇编的 JMP,还不足够做成操作系统
|
|
|
|
unsigned char task_id; /*当前活动任务号*/
unsigned char task_sp[MAX_TASKS]; /*任务的栈指针,实际就是每个任务的SP*/ unsigned int task_sleep[MAX_TASKS]; /*任务休眠计时器*/ unsigned char idata task_stack[MAX_TASKS][MAX_TASK_DEP]; /*任务私栈*/ void os_task_switch(void) /*任务切换函数(任务调度器)*/ { task_sp[task_id] = SP; while(1) { task_id++; if(task_id == MAX_TASKS) task_id = 0; if (task_sleep[task_id]==0) break; } SP = task_sp[task_id]; } void os_task_load(unsigned int fn, unsigned char tid) /*任务装入函数.将指定的函数(参数1)装入指定(参数2)的任务槽中.*/ { task_stack[tid][0] = (unsigned int)fn & 0xff; task_stack[tid][1] = (unsigned int)fn >> 8; task_sp[tid] = task_stack[tid]+1; /*准备 RETURN 的数据,SP将等于task_stack[tid][1]的地址*/ task_sleep[tid]=0; } |
|
|
|
使用
os_task_load(task1, 0); os_task_load(task2, 1); os_task_load(task3, 2); os_task_load(task4, 3); os_task_start(0); |
|
|
|
可以的。大兄弟。不错。
|
|
|
|
只有小组成员才能发言,加入小组>>
3280 浏览 9 评论
2958 浏览 16 评论
3460 浏览 1 评论
9004 浏览 16 评论
4052 浏览 18 评论
1117浏览 3评论
573浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
571浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2303浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1860浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-26 01:04 , Processed in 1.362495 second(s), Total 89, Slave 69 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号