关闭

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

发表于:2012-6-08 10:27

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:feixiaoxing    来源:51Testing软件测试网采编

  虽然写操作系统的博客要比写普通的技术点要麻烦一些,但是心中还是挺开心的。一方面,通过几行代码就可以说明一些问题,把理论实践化,这本身就很具有挑战性;另外一方面还锻炼自己的沟通能力,让更多的人明白你的想法,认可你的想法。

  其实,通过上面一篇博客,我们就已经清楚任务的创建是怎么一回事,但是我们还是愿意就这个问题讲得更细一点,说得更多一点。系统本身是多线程的,那说明所有线程的地址空间都是共享的。由于资源都是操作系统本身提供的,所以线程本身的要求就很低,函数名、堆栈、入口点、堆栈大小、优先级,大体上也就是这么多。至于这个堆栈是哪里的内存,其实已经不太重要了。为了简单起见,我们对原来的初始化函数 稍微修改了一下,

void task_init()
{
 UINT32 unit = STACK_LENGTH;

 memset((void*)data, 0, STACK_LENGTH * sizeof(UINT32));
 data[unit -1] = (UINT32) hello;
 data[unit -2] = 0;
 data[unit -3] = 0;
 data[unit -4] = 0;
 data[unit -5] = 0;
 data[unit -6] = 0;
 data[unit -7] = 0;
 data[unit -8] = 0;
 data[unit -9] = 0;
 data[unit -10] = (UINT32) &data[unit - 9];
 new = (UINT32) &data[unit -10];
}

  上面的操作比较简陋,只是对堆栈进行了设置。这是线程初始化的时候必须要做的一步。当然,这里的hello就是我们的函数入口点。因为这里用SIGALRM代替的时钟中断是没有办法做到抢占的,所以我们可以人为多设置一些调度点,比如象这样,

void hello()
{
 printf("count = %d in sub!\n", count ++);
 swap(&new, &old);
 printf("count = %d in sub!\n", count ++);
 swap(&new, &old);
 printf("count = %d in sub!\n", count ++);
 swap(&new, &old);
 printf("count = %d in sub!\n", count ++);
 swap(&new, &old);
 printf("count = %d in sub!\n", count ++);
 quit = 1;
 swap(&new, &old);
}

  在编写程序的时候,最恐怖的事情就是堆栈溢出了。但是在操作系统中,我们完全可以自己判断当前的堆栈是否已经溢出。因为我们知道,在线程调度的时候,保存的堆栈esp永远指向最低的那个地址。

int check_stack_overflow(unsigned int base, unsigned int current)
{
    assert(0 != base && 0 != current);

    return (current < base) ? 1 :0;
}

  当然,这些说的都是线程调度的事,你也可以编写输入输出命令,实现对嵌入式操作系统的某种控制。要打印什么,设置什么,保存什么,都可以通过你的输入命令来解析执行,这些都是和signal处理是分开来的。后面这部分还要详细讨论,这里可以稍微添加一下,

int main()
{
 char val;

 task_init();
 set_timer();
 signal(SIGALRM, signal_handler);

 while(1)
 {
     scanf("%c", &val);
 }

 exit(0);
 return 1;
}

21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号