一、前言

F28335棣属于TI C2000 DSP系列,它在电控相关的行业有较多的应用。但是因为种种原因,某些行业因为无“芯”可用,也会将它作为通用芯片使用。少得可怜的资料加上年代久远的CPU架构,要在这上面使用RTOS变得异常艰难。

二、混乱的SYS/BIOS

1.到底是SYS/BIOS、DSP/BIOS还是TI-RTOS?

28335官方主推使用的RTOS是SYS/BIOS,只是网络上几乎找不到实践项目,很多资料因为年代久远甚至描述得相互冲突。光是搞明白它们之间的关系,就花了我相当长的时间。

  • TI-RTOS:TI嵌入式生态系统的最新名称,它不仅包括了内核(SYS/BIOS)、还包含网络栈、文件系统等其他组件,适用于最新的TI CPU。
  • SYS/BIOS :TI-RTOS 的内核,28335只适用于它
  • DSP/BIOS :在一些老的资料中出现,其实它是SYS/BIOS的前身,在6.30版本改名SYS/BIOS
  • XDCtools :包含了SYS/BIOS包,也是它的构建工具

2.不推荐使用SYS/BIOS的理由

虽然SYS/BIOS是官方钦点的RTOS系统,我却不推荐刚准备入坑的人在F28335上使用或学习它,原因有:

  1. 从官方用户手册来看,SYS/BIOS的使用和构建与主流OS差异较大,学习的收益极低;
  2. DSP主要应用场景并不使用RTOS,因为成本和生态它的生存空间还不断被ARM挤压,感觉连TI自己都快放弃了。所以这极可能是一个大坑,出现了问题根本找不到相关资料。

三、移植UCOS的问题和改进

除了SYS/BIOS、网络资料中流传最广的是一份OS应用是由micrium的移植的ucosii代码,然而测试时却发现,这份代码存在不能调度抢断的问题。要理解和解决这个问题首先要从C2000系列CPU的栈空间架构和中断流程讲起。

1.28335的栈机制和中断流程

  • 28335由于设计得比较早,并不具备常见的双堆栈机制,也就是说应用和中断会共用同一个栈。
  • 根据手册和自己的测试,C2000的CPU级中断的过程如下(忽略外设级和PIE级):

1、中断锁存至IFRx中(其中x为中断线号),如果IERx有效且INTM为0,CPU响应中断;
2、cpu保存上下文环境到栈空间(包括了IER寄存器状态);
3、IFRx 置0,IERx置 0,INTM 置 1;
4、从向量表获取中断处理函数地址并执行;
5、恢复INTM,从栈空间恢复IER。
6、中断返回

2.问题分析

接下来以两个任务的系统调度为例看看为什么会发生异常。假设系统运行了两个任务,分别为线程A和B,当前运行线程A,接下来发生以下事件:
1.tick调度中断触发,CPU进入中断开始执行调度;
2.cpu因为中断保存上下文环境,此时IER被保存到线程A的栈空间;
3.调度器算法结果为系统切换到线程B;
4.切换SP到线程B的栈空间,为线程B恢复上下文环境;
5.继续执行中断第5步,即从线程B栈上下文环境恢复IER。
很显然,调度完成后,IERx并没有正确地在中断后恢复。如果线程B不主动执行调度切回到线程A,被置0的IERx将一直无法恢复,tick中断一直处于屏蔽状态,系统任务也无法完成切换。

3.IERx的恢复

IERx不能恢复这一坑,一度让我觉得无解,为此甚至使用了双定时器tick这样的骚操作。直到最近才找到较好的解决办法,timer tick函数的主要部分实现如下:

_KTS_TIMER2_ISR:
...; 保存任务上下文到TCB中
...; 获取IER值PUSH    ST1POP     ALTBIT    AL, #4SB      SPA_BIT_SET, TC ;TC = 1 跳到SPA_BIT_SET去获取IERMOV     AR7, *-SP[46]SB      SAVE_IER, UNC ; 已获取到IER, 跳到 SAVE_IER
SPA_BIT_SET:MOV     AR7, *-SP[48]
SAVE_IER:MOVL    *SP++, XAR7 ; 保存IER到当前任务的堆栈
...;  判断是任务主动执行的调度还是timer_tick函数触发;  timer_tick触发时执行tick处理函数
...LCR  _KTS_SV_Handle  ;  执行调度函数; 需要理解,IER的恢复是在下一个调度的任务中完成。MOVL    XAR7, *--SP  ; 从"上一个"任务的堆栈,获得IERMOVL    XAR0, #_kts_p_currentMOVL    XAR0, *XAR0MOVL    XAR0, *XAR0MOV     @SP, AR0  ; 切换到"新"任务
...; 从TCB中恢复"新"任务上下文环境
...

四、其他问题

  • DSP奇葩16位数据总线,不支持很多GNU特性,对初次上手的人非常不友好;
  • 所有任务应用栈必须额外预留中断栈的空间,包括空闲任务。
  • TI的printf函数会在栈上申请520字的内存,打印浮点,还会额外再申请520字。所以,不是有特别有需求,可以放弃浮点打印并使用精简的mini-printf函数。

五、总结

考虑收益问题,资料匮乏的情况下,学习一项过时的技术是愚蠢的。因此,总结就是,有条件还是尽量换平台,如果实在要用,需要充分考虑填坑的难度。

参考资料

[TI-RTOS Kernel (SYS/BIOS)User’s Guide] https://www.ti.com.cn/cn/lit/ug/spru430f/spru430f.pdf?ts=1628091876454
[TI SYS/BIOS的 创建工程实例] https://blog.csdn.net/xiaoluoshan/article/details/53785059
[micrium ucOSii_in_DSP28335] https://github.com/RanFang66/ucOSii_in_DSP28335
[TMS320x2833x, 2823x System Control and Interrupts Reference Guide]

在DSP28335上使用RTOS的经验总结相关推荐

  1. 黑苹果mac未能安装在你的电脑上_经历了无数次失败以后,我终于“吃”上了黑苹果,经验分享!...

    原标题:经历了无数次失败以后,我终于"吃"上了黑苹果,经验分享! 最近两天,在家闲来无事,我终于对家里那台古董机子"下手了",听说苹果电脑可以安装windows ...

  2. 微信抢抢票服务器,2018微信上怎么老是正在抢票?在微信上抢火车票的经验

    2018微信上怎么老是正在抢票?在微信上抢火车票的经验 马上就是新年啦!春运也已经开始啦!现在怎样抢火车票已经是我们在外游子的难题了!每年一快到春节,回家的火车票就很难抢,现在我们在微信上已经可以抢火 ...

  3. 我的世界刷猪人塔java版_我的世界速攻猪人塔详解 史上最牛的经验塔

    我的世界速攻猪人塔详解 史上最牛的经验塔.那下面给大家分享的这个是一个可以让所有经验塔自叹不如的速攻猪人塔哦~那到底这个塔是什么呢?那下面就给大家详细的介绍一下吧!有感兴趣的玩家不妨进来看看哦~希望大 ...

  4. 在51单片机上跑RTOS有没有意义?

    关注+星标公众号,不错过精彩内容 作者 | strongerHuang 微信公众号 | 嵌入式专栏 最近看见我的一个技术交流群在讨论一个问题:在51单片机上跑RTOS有没有意义? 今天就来围绕51和R ...

  5. python3 selenium web自媒体百家号企鹅号大鱼号acfun站,自动化上传视频以及经验总结分享

    前言 大家好,我是最渣的黑客,这几天在写selenium web 自动化.如果一个UP主在做自媒体,剪辑好一个视频要上传多个平台,而这些平台还没有互相关联可以进行同步,这个时候上传视频的工作就成了一个 ...

  6. Xenomai——实现一个GNU/Linux上的RTOS的仿真框架

    Copyright © 2002 Philippe Gerum [摘要] 一般来说,Xenomai 技术起初旨在帮助依靠传统 RTOS 应用程序设计者尽可能顺利移动到一个基于 GNU/ Linux 的 ...

  7. 我在App付费推广上,烧出来的经验

    手机广告平台怎样推广APP?一些推广人员在进行烧钱,转化率底下.不知道怎样增量和有效进行投放? 推广人员在负责APP新用户增长在增加的用户遇到瓶颈,老板希望可以扩展外投渠道拉新,但找不到合适的人员,也 ...

  8. 2020春季线上PAT甲级比赛经验(必看!!!)、155题目分类

    文章目录 1 经验与教训 1.1 比赛前期积累 1.2 比赛当日 1.2.1 oms客户端系统流程.注意事项(必看!!!) 1.2.2 考试经验 2 题目分类 3 需备知识点.代码模板 3.1 需备知 ...

  9. U9在SQL Server上的性能优化经验(转述) — 之 行版本快照

    此文根据用友的文档<基于SQL Server 2008构建SOA大型管理软件技术实践>"翻译"而成,非原创.在baidu上看见此文,觉得写的很好,就将原先的PPT细化一 ...

  10. 上财的计算机专业408,【2020考研】上财408分经验分享

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 数学,三月份到四月中旬把本科教材看了一遍.事实上还是有用的.比如,今年的二阶差分.看似超纲,其实不超纲.大纲要求认识二阶差分的形式,会解一阶差分方程.那道 ...

最新文章

  1. php 百度逆地理编码,百度逆地址解析
  2. Oracle NVL函数的用法
  3. AngularJS+RequireJs实现动态加载JS和页面的方案研究【上】
  4. 22 Python IO、打印到屏幕、读取键盘输入、打开和关闭文件、文件定位、重命名和删除文件、Python里的目录、文件,目录相关的方法
  5. ai/ml_您本周应阅读的有趣的AI / ML文章(8月15日)
  6. 前端学习(3042):vue+element今日头条管理-用户退出
  7. 剑指Offer - 面试题54. 二叉搜索树的第k大节点(二叉树循环遍历)
  8. cvc降噪和主动降噪_1MORE 主动降噪圈铁耳机图集
  9. linux安装.AppImage后缀安装包
  10. 国防科技大学计算机非军籍研究生就业情况,国防科技大学无军籍,将来就业前景怎样?涨知识了...
  11. 乔布斯《我生命中的三个故事》
  12. 阶段5 3.微服务项目【学成在线】_day03 CMS页面管理开发_09-修改页面-服务端-接口开发...
  13. linux 脚本监控程序,用shell脚本实现监控程序自动重启
  14. iOS7以上: 实现如“日历”的 NavigationBar
  15. java中常见的设计模式_在Java中10种常见设计模式详细介绍
  16. 南航计算机科学与技术学院老师,南航计算机科学与技术学院导师介绍:孙涵
  17. 两种实现九九乘法表的vb代码
  18. 轮询机制是什么意思(通俗理解轮询)
  19. Javascript 将阿拉伯数字转换成罗马数字
  20. 计算机专业必备电脑软件,你们的电脑桌面都有哪些必备的办公软件?

热门文章

  1. live2d_Live2D | CubismSdkForUnity4r.1简介(上)
  2. 计算机二级java技巧,计算机二级java难学吗
  3. NFT推动全球加密艺术浪潮
  4. ajax 传文件和参数,Ajax上传文件及携带参数
  5. Mp3原理及文件格式解析(from)
  6. C语言库函数源码在线,C语言库函数(包括所有函数)
  7. C语言进制转换 十进制转换为任意进制
  8. C语言:动态爱心代码
  9. 在linux下备份文件,linux备份文件命令
  10. linux系统下的打印机驱动下载,为 Linux 选择打印机 | Linux 中国