前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ISR之编程限制

ISR之编程限制

作者头像
Taishan3721
发布2020-01-17 14:33:05
1.2K0
发布2020-01-17 14:33:05
举报
文章被收录于专栏:这里只有VxWorks这里只有VxWorks

如转发,请标明出处!

编写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,限制多,尽快执行别阻塞。

诸多机制仍可用,任务通信不耽搁。

我是泰山,专注VX 15年!

一起学习,共同进步!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-01-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 这里只有VxWorks 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
消息队列 CMQ 版
消息队列 CMQ 版(TDMQ for CMQ,简称 TDMQ CMQ 版)是一款分布式高可用的消息队列服务,它能够提供可靠的,基于消息的异步通信机制,能够将分布式部署的不同应用(或同一应用的不同组件)中的信息传递,存储在可靠有效的 CMQ 队列中,防止消息丢失。TDMQ CMQ 版支持多进程同时读写,收发互不干扰,无需各应用或组件始终处于运行状态。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档