温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

编写ISR最基本的原则是什么

发布时间:2021-12-22 10:20:37 来源:亿速云 阅读:207 作者:小新 栏目:互联网科技

这篇文章将为大家详细讲解有关编写ISR最基本的原则是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

编写ISR最基本的原则就是:尽可能短。代码少是一方面,更重要的是ISR里不能调用可能阻塞或延迟的操作。

因为ISR不在常规任务上下文中运行,并且没有TCB,而是所有ISR共享一个栈(ISR_STACK_SIZE)。因此,ISR不能调用可能阻塞的函数。例如,它们不能申请信号量,因为信号量不可用时,内核会尝试将申请者切换到阻塞状态;不过,ISR可以释放信号量。另外,内存机制malloc()和free()会使用信号量,所以ISR里也不能调用这些函数,以及任何Create或Delete机制。ISR也不能通过VxWorks驱动程序执行I/O操作。尽管在I/O系统中没有固定的限制,但大多数设备驱动程序需要任务上下文,因为它们可能会等待设备的反馈。一个重要的例外是VxWorks的管道机制(Pipe),ISR可以使用Pipe进行写操作。ISR还可以调用VxWorks的一些机制来将消息打印到系统控制台:logMsg()、kprintf()和kputs()。

ISR不能调用使用浮点协处理器的机制。这是因为在VxWorks中,由intConnect()创建的中断驱动程序代码不保存和恢复浮点寄存器。如果ISR必须要使用浮点指令,则需要使用fppArchLib中的函数显式保存和还原浮点协处理器的寄存器。

ISR中调用C++语句时要特别小心。intConnect()机制要求在发生中断时执行函数的地址,但不能使用非静态成员函数的地址,因此必须实现静态成员函数。而且不能在ISR代码中实例化或删除对象。ISR中执行的C++代码应该限制为嵌入式C++,不应使用exception或RTTI (Run-Time Type Identification)。

ISR不应该直接访问共享数据区(shared data region)。ISR继承它抢占的任务的内存上下文,如果该任务没有映射该共享数据区,则它无法访问该内存,并导致异常。为了可靠地访问共享数据区,ISR可以将相关操作交给映射了该共享数据区的任务。

那么ISR中可以调用哪些机制或函数呢

bLib

所有函数

errnoLib

errnoGet(), errnoSet()

eventLib

eventSend()

fppArchLib

fppSave(), fppRestore()

intLib

intContext(), intCount(), intVecSet(),  intVecGet()

intArchLib

intLock(), intUnlock()

logLib

logMsg()

lstLib

除lstFree(),所有函数

mathALib

使用fppSave()/fppRestore()时,所有函数

msgQLib

msgQSend()

rngLib

除rngCreate()/rngDelete(),所有函数

pipeDrv

write()

selectLib

selWakeup(), selWakeupAll()

semLib

semFlush(),非互斥信号量的semGive()

semPxLib

sem_post()

sigLib

kill()

taskLib

taskSuspend(), taskResume(),  taskPrioritySet(), taskPriorityGet(), taskIdVerify(), taskIdDefault(),  taskIsReady(), taskIsSuspended(), taskIsPended(), taskIsDelayed(), taskTcb()

tickLib

tickAnnounce(), tickSet(), tickGet()

tyLib

tyIRd(), tyITx()

vxLib

vxTas(), vxMemProbe()

wdLib

wdStart(), wdCancel()

中断到任务的通信机制

  • 共享内存。ISR可以与任务代码共享变量、缓冲区和环形缓冲区

  • 信号量。ISRs可以释放信号量,任务可以接收或等待这些信号量(互斥信号量和VxMP共享信号量除外)

  • 消息队列。ISR可以向消息队列发送消息(使用VxMP的共享消息队列除外)。如果队列已满,则丢弃该消息。msgQSend (msgQId, buffer, nBytes, NO_WAIT,priority)

  • 管道。ISR可以向管道发送消息。如果管道已满,则丢弃该消息

  • 信号。ISR可以向任务发送信号,从而导致其信号处理程序的异步调度

  • VxWorks Event。ISR可以向任务发送VxWorks Event

关于“编写ISR最基本的原则是什么”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

isr
AI