没有合适的资源?快使用搜索试试~ 我知道了~
嵌入式系统/ARM技术中的VxWorks任务编程中常见异常分析
5星 · 超过95%的资源 1 下载量 28 浏览量
2020-12-08
21:42:08
上传
评论
收藏 82KB PDF 举报
温馨提示
试读
2页
在任务运行过程中,会出现一些异常的情况,导致任务不能正常运行或者对操作系统造成影响。一般来说,这些异常是由程序的逻辑错误造成的,防止这些异常情况的出现和出现后进行补救就有格外重要的意义。 1 代码重入与共享 在应用中,可能会出现多个任务调用同一段代码的情况,由于任务占用CPU是串行的,不会出现代码资源使用冲突。但是,不同优先级的任务同时调用同一段代码,则可能出现低优先级任务执行某一函数时被执行该函数的高优先级任务打断的情况,如果函数中要改写全局变量而没有使用互斥,就有可能导致错误的存取。例如在中断中调用内存分配或者释放函数,如果某个任务正在调用内存分配函数或者是内存释放函数,打断该
资源推荐
资源详情
资源评论
嵌入式系统嵌入式系统/ARM技术中的技术中的VxWorks任务编程中常见异常分析任务编程中常见异常分析
在任务运行过程中,会出现一些异常的情况,导致任务不能正常运行或者对操作系统造成影响。一般来说,这
些异常是由程序的逻辑错误造成的,防止这些异常情况的出现和出现后进行补救就有格外重要的意义。 1 代码
重入与共享 在应用中,可能会出现多个任务调用同一段代码的情况,由于任务占用CPU是串行的,不会出现
代码资源使用冲突。但是,不同优先级的任务同时调用同一段代码,则可能出现低优先级任务执行某一函数时
被执行该函数的高优先级任务打断的情况,如果函数中要改写全局变量而没有使用互斥,就有可能导致错误的
存取。例如在中断中调用内存分配或者释放函数,如果某个任务正在调用内存分配函数或者是内存释放函数,
打断该
在任务运行过程中,会出现一些异常的情况,导致任务不能正常运行或
者对操作系统造成影响。一般来说,这些异常是由程序的逻辑错误造成
的,防止这些异常情况的出现和出现后进行补救就有格外重要的意义。
1 代码重入与共享
在应用中,可能会出现多个任务调用同一段代码的情况,由于任务占
用CPU是串行的,不会出现代码资源使用冲突。但是,不同优先级的任
务同时调用同一段代码,则可能出现低优先级任务执行某一函数时被执
行该函数的高优先级任务打断的情况,如果函数中要改写全局变量而没
有使用互斥,就有可能导致错误的存取。例如在中断中调用内存分配或
者释放函数,如果某个任务正在调用内存分配函数或者是内存释放函
数,打断该任务时会造成异常,可能导致内存泄漏,甚至有可能会因在
中断中异常而reboot。另外,如果多个任务共用的代码中有全局变量且
使用目的不同,或者多个任务的代码中有全局变量同名的情况,则有可
能造成变量使用中的错误。VxWorks提供了任务变量(taskVar)的方
法来解决这个问题,任务可以将使用的全局变量作为任务变量独立使
用,添加的任务变量保存在任务的上下文中,任务切换时保存当前内
容。
2 符号表的使用
VxWorks中有模块(module)的概念。装载模块完成目标代码文件在
内存中的链接,并可以将目标代码文件中的函数与全局变量加入符号
表。符号表中的符号对C语言编写的函数以原来名字命名,对于C++语
言的函数则是在后面加上形参的数据类型作为符号名。如f1( )的符号名
为f1__Fv,最后的v表示void类型;f2(int)符号名为f2__Fi,f3(int,int)为
f3__Fii,依此类推。代码的编译过程中并不对要使用的函数和变量进行
检查。例如调用一个并不存在的函数编译并不报错,编译器认为此函数
可能在操作系统内核中或者已经下载的目标文件中,但在目标文件下载
时会找不到要调用的函数。如果符号表中的符号出现了重名,譬如两次
下载的目标文件中有函数重名,则要作散列处理,之后对该函数的调用
是最后加入符号表的函数,而之前已经装载的模块则不会受到影响。如
果应用程序中使用了与操作系统内核同名的符号,则对操作系统某些
API函数的调用将会失败。
3 特殊的任务保护
在VxWorks中,当一个任务被删除,其它任务不会得到通知,而且由
于任务间的独立性,每一个任务可以无限制地删除其它任务。在应用
中,我们可能会把需要保护任务误删除。VxWorks 提供的两个函数
taskSafe( )和taskUnsafe( )将通知意外删除任务而引起的问题。当任务
调用taskSafe( )时,从调用的那一刻起,该任务就被保护起来而不会被
其它任务删除。如果任务1试图删除已经调用taskSafe( )的任务2,则任
务1将被阻塞,直到任务2调用taskUnsafe( )。保护只能由任务自己实
现,一个任务不能safe或unsafe另外一个任务。taskSafe( )和
taskUnsafe( )支持嵌套模式。如果有嵌套发生,一个计数器将开始工
作,每有一个taskSafe( )被调用,则计数器加1;调用1个taskUnsafe(
),则计数器减1。只有当计数器为0时,才能删除该任务。
有时为了执行效率等原因,任务的运行需要禁止基于优先级的抢占,
这可以通过调用taskLock( )实现。如果任务1调用taskLock( )禁止了高
优先级任务对它的抢占,当任务1被阻塞或被暂停,核心将调度下一个
具有最高优先级的就绪任务运行。如果这时任务1又就绪且被调度运
行,抢占又被禁止。但是,禁止基于优先级的抢占可以阻止任务切换,
却并不会屏蔽中断。调用taskUnLock( )可以解除优先级抢占的禁止,通
过调用taskLock( )和taskUnLock( )可以实现对临界资源的互斥访问。
资源评论
- 马虫医生2023-07-27这份文件很详实,能够深入剖析VxWorks任务编程中的常见异常情况,对于嵌入式系统/ARM技术的开发者来说非常实用。
- 卡哥Carlos2023-07-27作者对于VxWorks任务编程异常的处理策略给出了实际可行的建议,反映了实际工作中的实际问题。
- 普通网友2023-07-27这篇文章对于VxWorks任务编程中的常见异常进行了系统性的整理和总结,有助于开发者更好地理解和解决问题。
- 豆瓣时间2023-07-27文章内容客观,准确描述了VxWorks任务编程中的异常分析方法,对于解决问题很有帮助。
- 英次2023-07-27这篇文档将嵌入式系统/ARM技术中的VxWorks任务编程异常分析问题解释得很清晰,对于初学者来说易于理解。
weixin_38604395
- 粉丝: 3
- 资源: 910
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功