背景
我的学长在一家有名的AI公司上班,他们希望能将OpenCV移植到一款低成本的CPU上,但他们对于硬件完全不懂,于是学长希望我尝试一下(虽然我那时也还不懂操作系统和CPU间的关系)。选择stm32h743vi这个型号的单片机首先当然是因为他与arm contex-a内核的CPU相比很便宜啦,其次他有DMA2D控制器,说是“专用于图像处理的专业 DMA”,然后片上ROM和RAM都还比较大,就选它了。后来看手册的时候,才发现这个所谓的DMA2D仅仅只能实现对图像的像素点进行修改值操作,并没有支持其他的图像操作(如填充,二值化之类的),感觉被商家的广告骗了。而且后来经过诸多尝试后,确定想在cortex-m这种芯片上移植OpenCV简直可笑,不光OpenCV没有嵌入式实时操作系统的支持代码,就连交叉编译的cmake也不支持一些嵌入式实时操作系统。
刚开始接手项目的那个时候,我仅仅看过linux内核相关的书,linux设备驱动也简单看过一点,后来因为看不下去就没看了,所以我没有任何实际的操作系统移植经验,总之啥也不懂。一开始我就不分青红皂白地选了一个操作系统:eCOS,希望将eCOS移植到stm32h743vi上,然后再移植OpenCV到eCOS上。选择这个操作系统的原因,是我当时看了一篇博客,这篇博客比较了一下几个主流的嵌入式实时操作系统(uCOS, eCOS, freeRTOS, uCLinux等),然后我注意到一个硬性条件:是否支持无MMU内存管理
单元的单片机。查阅知cortex-m内核的stm32h743vi是没有MMU的,于是我只能在支持无MMU的单片机的操作系统中进行选择。接着,在这些操作系统中,由于eCOS被吹得比较厉害,我就直接选择了它,也没有做进一步的调研工作。
过程
正式开始移植后,我才发现eCOS官方对于cortex-m内核的stm32系列单片机,只完成了f101~f103的移植工作,即只做了comtex-m3的移植工作。而我使用的stm32h743vi是属于m7内核的,相比m3,时钟树等结构都发生了多大变化,还增添了很多新的特性。按照移植的类型(platform-variant-architecture),这已经属于variant等级的移植了,难度很大。
我在尝试的过程中,完成了这部分代码(虽然并没有运行成功):往configtool的template中添加stm32h743vi;代码目录中增加新的var:cortex-m7用于存放m7内核级的代码;增加新的platform:stm32h743vi用于存放平台级的代码。上述代码中,内核级和平台级的代码各包含什么内容忘了,我是仿照eCOS官方的m3内核的例子来写的,总的来说,eCOS官方做的移植的目录结构也很混乱,所以我的也比较混乱。毕竟最终没运行成功,我也懒得去翻以前写的代码了,大概就是这些内容:定义各个寄存器的地址、定义io操作的接口、定义诊断信息的接口(说白了就是串口输出信息)、定义时钟等初始化函数、更改片上ROM和RAM起始地址和长度。
我比较疑惑的地方,在于汇编写的启动文件上。之前我一直用keil MDK进行开发,启动文件(如startup_stm32h743vi.s)都是写好的。但是我在官方移植的m3内核的代码中并没有找到类似的汇编文件。我找到的汇编文件,内容都是eCOS相关的,比如虚拟向量表、ISR、VSR之类的代码。另外,eCOS是使用GNU工具进行搭建的,而MDK是用armcc进行搭建的,我也没法把MDK上的代码用到这里面来。
还有一点比较恶心的,就是eCOS官方没有推荐使用任何IDE进行开发,唯一提供的就是一个图形化界面的configtool(还有一个命令行工具,那个更麻烦,不提了),但是他也不具备调试功能,甚至不能写代码,最后我都是用gedit一点点手敲代码弄的。
还有,eCOS官方移植的m3的代码居然编译会报错,然后生成不了redboot,我也是醉了,我记得问题出在swi这一汇编伪指令和另外一段汇编代码上,这让仿照官方例子进行移植工作的我深深怀疑这个项目到底能不能完成,可以说恶心死我了。
最后,虽然整个工程编译通过了,也成功下载到板子上了,但CPU根本没启动。。。也就是说,初始化都没完成,更别说让LED亮灭来进行调试了。由于没有IDE,出了问题我也不知道怎么调试,再加上之前的种种不确定的问题,最后我就放弃将eCOS移植到m7内核上了。
感受
eCOS虽然发展的不错,官方邮件列表里很活跃,官方也完成了很多CPU的移植,但是在cortex-m上的移植工作显然做的不好。再加上国内的eCOS资料非常少,书籍也就那么两本(讲得也只能算科普),官方教程也很简陋,eCOS学起来真的很难受。如果官方没有做好你的目标芯片的移植工作,建议不要选择eCOS。
背景
我的学长在一家有名的AI公司上班,他们希望能将OpenCV移植到一款低成本的CPU上,但他们对于硬件完全不懂,于是学长希望我尝试一下(虽然我那时也还不懂操作系统和CPU间的关系)。选择stm32h743vi这个型号的单片机首先当然是因为他与arm contex-a内核的CPU相比很便宜啦,其次他有DMA2D控制器,说是“专用于图像处理的专业 DMA”,然后片上ROM和RAM都还比较大,就选它了。后来看手册的时候,才发现这个所谓的DMA2D仅仅只能实现对图像的像素点进行修改值操作,并没有支持其他的图像操作(如填充,二值化之类的),感觉被商家的广告骗了。而且后来经过诸多尝试后,确定想在cortex-m这种芯片上移植OpenCV简直可笑,不光OpenCV没有嵌入式实时操作系统的支持代码,就连交叉编译的cmake也不支持一些嵌入式实时操作系统。
刚开始接手项目的那个时候,我仅仅看过linux内核相关的书,linux设备驱动也简单看过一点,后来因为看不下去就没看了,所以我没有任何实际的操作系统移植经验,总之啥也不懂。一开始我就不分青红皂白地选了一个操作系统:eCOS,希望将eCOS移植到stm32h743vi上,然后再移植OpenCV到eCOS上。选择这个操作系统的原因,是我当时看了一篇博客,这篇博客比较了一下几个主流的嵌入式实时操作系统(uCOS, eCOS, freeRTOS, uCLinux等),然后我注意到一个硬性条件:是否支持无MMU内存管理
单元的单片机。查阅知cortex-m内核的stm32h743vi是没有MMU的,于是我只能在支持无MMU的单片机的操作系统中进行选择。接着,在这些操作系统中,由于eCOS被吹得比较厉害,我就直接选择了它,也没有做进一步的调研工作。
过程
正式开始移植后,我才发现eCOS官方对于cortex-m内核的stm32系列单片机,只完成了f101~f103的移植工作,即只做了comtex-m3的移植工作。而我使用的stm32h743vi是属于m7内核的,相比m3,时钟树等结构都发生了多大变化,还增添了很多新的特性。按照移植的类型(platform-variant-architecture),这已经属于variant等级的移植了,难度很大。
我在尝试的过程中,完成了这部分代码(虽然并没有运行成功):往configtool的template中添加stm32h743vi;代码目录中增加新的var:cortex-m7用于存放m7内核级的代码;增加新的platform:stm32h743vi用于存放平台级的代码。上述代码中,内核级和平台级的代码各包含什么内容忘了,我是仿照eCOS官方的m3内核的例子来写的,总的来说,eCOS官方做的移植的目录结构也很混乱,所以我的也比较混乱。毕竟最终没运行成功,我也懒得去翻以前写的代码了,大概就是这些内容:定义各个寄存器的地址、定义io操作的接口、定义诊断信息的接口(说白了就是串口输出信息)、定义时钟等初始化函数、更改片上ROM和RAM起始地址和长度。
我比较疑惑的地方,在于汇编写的启动文件上。之前我一直用keil MDK进行开发,启动文件(如startup_stm32h743vi.s)都是写好的。但是我在官方移植的m3内核的代码中并没有找到类似的汇编文件。我找到的汇编文件,内容都是eCOS相关的,比如虚拟向量表、ISR、VSR之类的代码。另外,eCOS是使用GNU工具进行搭建的,而MDK是用armcc进行搭建的,我也没法把MDK上的代码用到这里面来。
还有一点比较恶心的,就是eCOS官方没有推荐使用任何IDE进行开发,唯一提供的就是一个图形化界面的configtool(还有一个命令行工具,那个更麻烦,不提了),但是他也不具备调试功能,甚至不能写代码,最后我都是用gedit一点点手敲代码弄的。
还有,eCOS官方移植的m3的代码居然编译会报错,然后生成不了redboot,我也是醉了,我记得问题出在swi这一汇编伪指令和另外一段汇编代码上,这让仿照官方例子进行移植工作的我深深怀疑这个项目到底能不能完成,可以说恶心死我了。
最后,虽然整个工程编译通过了,也成功下载到板子上了,但CPU根本没启动。。。也就是说,初始化都没完成,更别说让LED亮灭来进行调试了。由于没有IDE,出了问题我也不知道怎么调试,再加上之前的种种不确定的问题,最后我就放弃将eCOS移植到m7内核上了。
感受
eCOS虽然发展的不错,官方邮件列表里很活跃,官方也完成了很多CPU的移植,但是在cortex-m上的移植工作显然做的不好。再加上国内的eCOS资料非常少,书籍也就那么两本(讲得也只能算科普),官方教程也很简陋,eCOS学起来真的很难受。如果官方没有做好你的目标芯片的移植工作,建议不要选择eCOS。
举报