在以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时止,任务栈是不会切换的(栈指针都在一个任务的栈空间中变
化)。

据此,我们可以这样改动:设置一个缓冲区OSInterruptStk,作为嵌套中断的栈空间,
由所有任务共享,中断服务程序改为:
1、保存全部CPU寄存器
2、调用OSIntEnter或OSIntNesting直接加1
增加:2.1、判断OSIntNesting是否等于1,如果不是则转到3
增加:2.2、将栈指针SP保存到OSTCBCur->OSTCBStkPtr
增加:2.3、将SP指向OSInterruptStk的栈顶(注意栈增长的方向)。
3、执行用户代码做中断服务
4、调用OSIntExit
增加:4.1、判断OSIntNesting是否等于0,如果不是则转到5
增加:4.2、从OSTCBCur->OSTCBStkPtr中恢复栈指针SP
5、恢复所有CPU寄存器
6、执行中断返回指令

并且要修改OSIntCtxSw函数,原始的OSIntCtxSw函数的写法是:
1、调整栈指针来去掉在调用:OSIntExit,OSIntCtxSw过程中入栈的多余内容
2、将当前任务栈指针保存到OSTCBCur中(OSTCBCur->OSTCBStkPtr = __SP__)
3、如果需要则调用OSTaskSwHook
4、OSTCBCur = OSTCBHighRdy
5、OSPrio = OSPrioHighRdy
6、从OSTCBCur中恢复栈指针(__SP__ = OSTCBCur->OSTCBStkPtr)
7、恢复保存了的CPU寄存器
8、执行中断返回指令

新的写法只需将原写法中的1,2去掉即可,因为1,2步只是保存旧任务的栈指针,而新的写
法中,这些步被移到了“中断服务程序”中的2.2。

UCOS中断函数的编写相关推荐

  1. c语言 串口中断服务函数,GCC-AVR 编写中断服务函数的注意事项

    //注意:本文使用的GCC-AVR版本为WinAVR20100110 中断不是C语言的一部分,中断的实现是由编译器实现的.所以,不同版本的编译器的中断的写法有很大的不同:即便同样是WinAVR,不同版 ...

  2. 9、IAR中断向量表与中断服务函数的编写

    1.stm8S的中断向量表 /*----------------------------------------------------* Interrupt vector numbers*----- ...

  3. c语言t0中断方式编程,PIC C语言编程_PICC中断函数的实现

    PICC可以实现C语言的中断服务程序.中断服务程序有一个特殊的定义方法: voidinterruptISR(void); 其中的函数名"ISR"可以改成任意合法的字母或数字组合,但 ...

  4. C51 基本函数、中断函数和库函数的详解

    函数的定义和调用 此外,C51编译器本身还提供了丰富的库函数,用户可以根据需要随时调用,从而大大提高编程效率. 1. 函数的定义 函数定义的一般形式为: 函数类型 函数名(形参列表) { 局部变量定义 ...

  5. STM32是如何进入中断函数的

    中断相信很多人都知道是什么意思,不同的任务有不同的优先级,高任务优先级会比低优先级先执行.在嵌入式系统中, 任务的调度和切换都是根据优先级来判断的. 中断可以分为软中断和硬中断.一开始接触到的一般都是 ...

  6. STM32共用中断和共用中断函数的判断

    STM32外部中断查询: 15-10线的外部中断共用一个中断函数,怎么在该函数里查询是哪个中断线产生了中断呢? 使用 EXTI_GetITStatus()来查询哪根线产生了中断. 比如EXTI_Get ...

  7. 关于中断处理程序中的关中断函数disable_irq和disable_irq_nosync

    2010年7月20日19:18:30 关于中断处理程序中的关中断函数disable_irq和disable_irq_nosync disable_irq关闭中断并等待中断处理完后返回, 而disabl ...

  8. c语言 执行free函数程序被卡住,FreeRTOS操作系统,在按键中断函数中恢复被挂起的任务,程序卡死的原因和解决办法...

    FreeRTOS操作系统,在按键中断函数中恢复被挂起的任务,程序卡死的原因和解决办法 时间:2019-08-10 14:39:47  来源:  作者:  所属栏目:其他服务端 这里将告诉您FreeRT ...

  9. STM32F103ZE单片机在WWDG窗口看门狗的EWI中断中喂狗导致系统复位的原因及解决办法(中断函数重入问题)

    版权声明:本文为博主原创文章,欢迎转载    https://blog.csdn.net/ZLK1214/article/details/78308058 程序开启了WWDG的Early wakeup ...

最新文章

  1. SqlSugar ORM 入门到精通【一】入门篇
  2. sklearn 分类(上证指数涨跌预测)
  3. centos查看系统/硬件信息及运维常用命令
  4. MySQL8.0连接url
  5. URL不能过长,否则summit方法提交失败
  6. 计算机公式sin,三角函数计算公式大全
  7. Liferay layout_configuration 分析
  8. 关键词策略 —关键词选择
  9. i春秋 - Exploit-Exercises: Nebula - level03
  10. 博网即时通讯软件的设计与实现(附源码+课件+数据库+资料)
  11. 【筹码分析】改版通达信PAVE筹码引力分析个股强势区和走势
  12. ibm vios_使用IBM地理分散弹性解决方案在生产现场保留冗余VIOS配置
  13. Adobe又逆天!不用机器学习,用13.5M软件把《长安十二时辰》变成水墨动画
  14. 【Mybatis学习路线】day02mybatis的增删改查操作
  15. 内网穿透工具natcross2
  16. 计算机编程知识竞赛,程序设计竞赛
  17. metaq spring
  18. 通达信标记符号_通达信指标中赋值符号“:”、“=”、“:=”区别?
  19. 网络舆情信息整理分析怎么有效做好的方法
  20. 大数据揭秘诺奖评选“潜规则”

热门文章

  1. 中文手机评论情感分类系列(一)
  2. mock平台架构及实现
  3. UVALive 3942 Remember the Word(字典树+DP)
  4. 【UI】android如何绘制一个饼图
  5. 《OpenGL超级宝典》编程环境配置
  6. Google App Engine使用简介
  7. 使用for及递归求 1-100的和
  8. Windows域的管理
  9. [论文阅读] (17)CCS2019 针对PowerShell脚本的轻量级去混淆和语义感知攻击检测(经典)
  10. HarmonyOS之LED灯和振动器Vibrator的功能和使用