Chinaunix首页 | 论坛 | 博客
  • 博客访问: 443587
  • 博文数量: 155
  • 博客积分: 786
  • 博客等级: 军士长
  • 技术积分: 1561
  • 用 户 组: 普通用户
  • 注册时间: 2012-09-01 23:37
个人简介

在路上

文章分类

全部博文(155)

文章存档

2016年(2)

2015年(36)

2014年(45)

2013年(34)

2012年(38)

我的朋友

分类: 嵌入式

2015-06-25 13:53:59

UCOS中断函数的编写

在以uC/OS为操作系统的项目中,系统可能要处理各种不同的中断请求,如果某个中断处理
程序需要调用uC/OS的各种Post函数向任务发出消息,那么uC/OS建议中断服务程序的写法是:

1、保存全部CPU寄存器
2、调用OSIntEnter或OSIntNesting直接加1
3、执行用户代码做中断服务
4、调用OSIntExit
5、恢复所有CPU寄存器
6、执行中断返回指令
暂且称为“标准中断”方式,这种方式实际上是将这个中断处理加入了任务调度系统,也就是
说这个中断可以引起任务的切换。

如果在中断处理中没有调用各种Post函数的话,则可以用一般的、象原来没有操作系统时的
写法:
1、保存中断处理程序需要用到的CPU寄存器
2、执行中断处理
3、恢复保存了的CPU寄存器
4、执行中断返回指令
暂且称为“快中断”方式,按照这种方法定义的中断永远不会引起任务切换。

在uC/OS系统中,每个任务都要定义独立的栈空间,一个栈空间的使用包括5个部分:
1、任务包括的各个函数的调用返回地址
2、任务包括的各个函数中可能在栈上分配的局部变量
3、发生了“标准中断”方式定义的中断或任务被挂起时,所要保存的任务上下文
4、发生了“快中断”方式定义的中断时,中断处理程序所需要的栈空间
5、中断嵌套时,所要保存的中断嵌套上下文

在这些使用的部分中,1,2,3,4的内存占用量是比较容易估算的,最精确和保险的确定
方法是:查看由C生成的asm文件,并计算各个函数的栈使用量。但是第5部分的栈空间使用
量是随中断嵌套的深度而不断增加的,是不确定的,一般的方法只能定义一个充分大的栈
空间,使之不会溢出。

为每个任务都定义一个充分大的栈空间,这在某些内存稀缺的小项目中是非常痛苦的,
有时不得不增扩内存,这就会使成本增加。

我深入研究了uC/OS后,认为,可以将所有任务栈空间使用的第5部分合并,这样将会大大的
降低整个系统对内存的需求。

uC/OS的任务调度是靠OS_Sched和 OSIntExit来完成的,这两个函数中都要先判断一个叫 
OSIntNesting的系统变量,如果OSIntNesting不为0,则不进行任务切换。也就是说:
在OSIntNesting为1(当前只有一个中断在处理中,并且没有嵌套的中断)时起,
如果发生了嵌套的中断(不管嵌套的层数有深),那么在所有嵌套的中断一层一层地都返回
直到 OSIntNesting再次为1时止,任务栈是不会切换的(栈指针都在一个任务的栈空间中变
化)。


阅读(1108) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~