嵌入式操作系统内核原理和开发(任务创建和堆栈溢出检查).pdf

上传人:qwe****56 文档编号:74652723 上传时间:2023-02-27 格式:PDF 页数:5 大小:399.80KB
返回 下载 相关 举报
嵌入式操作系统内核原理和开发(任务创建和堆栈溢出检查).pdf_第1页
第1页 / 共5页
嵌入式操作系统内核原理和开发(任务创建和堆栈溢出检查).pdf_第2页
第2页 / 共5页
点击查看更多>>
资源描述

《嵌入式操作系统内核原理和开发(任务创建和堆栈溢出检查).pdf》由会员分享,可在线阅读,更多相关《嵌入式操作系统内核原理和开发(任务创建和堆栈溢出检查).pdf(5页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、本文由长春白癜风专科医院 http:/ 本文由吉林白癜风医院 http:/ 嵌入式操作系统内核原理和开发(任务创建和堆栈溢出检嵌入式操作系统内核原理和开发(任务创建和堆栈溢出检查)查)虽然写操作系统的博客要比写普通的技术点要麻烦一些,但是心中还是挺开心的。一方面,通过几行代码就可以说明一些问题,把理论实践化,这本身就很具有挑战性;另外一方面还锻炼自己的沟通能力,让更多的人明白你的想法,认可你的想法。其实,通过上面一篇博客,我们就已经清楚任务的创建是怎么一回事,但是我们还是愿意就这个问题讲得更细一点,说得更多一点。系统本身是多线程的,那说明所有线程的地址空间都是共享的。由于资源都是操作系统本身提

2、供的,所以线程本身的要求就很低,函数名、堆栈、入口点、堆栈大小、优先级,大体上也就是这么多。至于这个堆栈是哪里的内存,其实已经不太重要了。为了简单起见,我们对原来的初始化函数 稍微修改了一下,cpp view plaincopy 1.void task_init()2.3.UINT32 unit=STACK_LENGTH;4.5.memset(void*)data,0,STACK_LENGTH*sizeof(UINT32);6.dataunit-1=(UINT32)hello;7.dataunit-2=0;8.dataunit-3=0;9.dataunit-4=0;10.dataunit-5=

3、0;11.dataunit-6=0;12.dataunit-7=0;13.dataunit-8=0;14.dataunit-9=0;15.dataunit-10=(UINT32)&dataunit-9;16.new=(UINT32)&dataunit-10;17.上面的操作比较简陋,只是对堆栈进行了设置。这是线程初始化的时候必须要做的一步。当然,这里的 hello 就是我们的函数入口点。因为这里用 SIGALRM 代替的时钟中断是没有办法做到抢占的,所以我们可以人为多设置一些调度点,比如象这样,cpp view plaincopy 1.void hello()2.3.printf(count=

4、%d in sub!n,count+);4.swap(&new,&old);5.printf(count=%d in sub!n,count+);本文由长春白癜风专科医院 http:/ 本文由吉林白癜风医院 http:/ 6.swap(&new,&old);7.printf(count=%d in sub!n,count+);8.swap(&new,&old);9.printf(count=%d in sub!n,count+);10.swap(&new,&old);11.printf(count=%d in sub!n,count+);12.quit=1;13.swap(&new,&old)

5、;14.在编写程序的时候,最恐怖的事情就是堆栈溢出了。但是在操作系统中,我们完全可以自己判断当前的堆栈是否已经溢出。因为我们知道,在线程调度的时候,保存的堆栈 esp永远指向最低的那个地址。cpp view plaincopy 1.int check_stack_overflow(unsigned int base,unsigned int current)2.3.assert(0!=base&0!=current);4.5.return(current base)?1:0;6.当然,这些说的都是线程调度的事,你也可以编写输入输出命令,实现对嵌入式操作系统的某种控制。要打印什么,设置什么,保存

6、什么,都可以通过你的输入命令来解析执行,这些都是和 signal 处理是分开来的。后面这部分还要详细讨论,这里可以稍微添加一下,cpp view plaincopy 1.int main()2.3.char val;4.5.task_init();6.set_timer();7.signal(SIGALRM,signal_handler);8.9.while(1)10.11.scanf(%c,&val);12.13.14.exit(0);15.return 1;16.本文由长春白癜风专科医院 http:/ 本文由吉林白癜风医院 http:/ 最后,还是老规矩,附上详细的代码。虽然这一过程有点繁

7、琐和冗余,但是至少看上去更完整一些。cpp view plaincopy 1.#include 2.#include 3.#include 4.#include 5.#include 6.#include 7.8.#define UINT32 unsigned int 9.#define STACK_LENGTH 512 10.11.static struct itimerval oldtv;12.UINT32 old=0;13.UINT32 new=0;14.UINT32 count=0;15.UINT32 dataSTACK_LENGTH=0;16.UINT32 quit=0;17.18.

8、void set_timer()19.20.struct itimerval itv;21.itv.it_interval.tv_sec=1;22.itv.it_interval.tv_usec=0;23.itv.it_value.tv_sec=1;24.itv.it_value.tv_usec=0;25.setitimer(ITIMER_REAL,&itv,&oldtv);26.27.28.void swap(UINT32*prev,UINT32*next)29.30._asm(push%eaxnt 31.push%ebxnt 32.push%ecxnt 33.push%edxnt 34.p

9、ush%esint 35.push%edint 36.push%ebpnt 37.push%espnt 38.lea 0 x8(%ebp),%eaxnt 39.mov(%eax),%eaxnt 40.mov%esp,(%eax)nt 本文由长春白癜风专科医院 http:/ 本文由吉林白癜风医院 http:/ 41.42.lea 0 xc(%ebp),%eaxnt 43.mov(%eax),%eaxnt 44.mov(%eax),%espnt 45.pop%espnt 46.pop%ebpnt 47.pop%edint 48.pop%esint 49.pop%edxnt 50.pop%ecxnt

10、 51.pop%ebxnt 52.pop%eaxnt 53.:);54.55.56.void hello()57.58.printf(count=%d in sub!n,count+);59.swap(&new,&old);60.printf(count=%d in sub!n,count+);61.swap(&new,&old);62.printf(count=%d in sub!n,count+);63.swap(&new,&old);64.printf(count=%d in sub!n,count+);65.swap(&new,&old);66.printf(count=%d in s

11、ub!n,count+);67.quit=1;68.swap(&new,&old);69.70.71.void task_init()72.73.UINT32 unit=STACK_LENGTH;74.75.memset(void*)data,0,STACK_LENGTH*sizeof(UINT32);76.dataunit-1=(UINT32)hello;77.dataunit-2=0;78.dataunit-3=0;79.dataunit-4=0;80.dataunit-5=0;81.dataunit-6=0;82.dataunit-7=0;83.dataunit-8=0;84.datau

12、nit-9=0;本文由长春白癜风专科医院 http:/ 本文由吉林白癜风医院 http:/ 85.dataunit-10=(UINT32)&dataunit-9;86.new=(UINT32)&dataunit-10;87.88.89.int check_stack_overflow(unsigned int base,unsigned int current)90.91.assert(0!=base&0!=current);92.93.return(current base)?1:0;94.95.96.void signal_handler(int m)97.98.if(0=quit)99.

13、100.swap(&old,&new);101.assert(0=check_stack_overflow(data,new);102.return;103.104.105.printf(count=%d in main!n,count+);106.107.108.int main()109.110.char val;111.112.task_init();113.set_timer();114.signal(SIGALRM,signal_handler);115.116.while(1)117.118.scanf(%c,&val);119.120.121.exit(0);122.return 1;123.

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 技术资料 > 其他杂项

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁