玩STR9一段时间的,我用的是STR912FW44,属于STR91x系列中,档次较高的那个,有512K Flash和96K SRAM,96MHz的主频,足以全面取代普通单片机的.
比较有趣的是STR9的指令集是兼容ARM7的,所以无怪乎称为ARM7的加强版.
玩ARM9也不难的,都是Firmware调用,有点类似API,比起单片机直接操作寄存器方便多的.
不过ARM9的资源就是多呢,玩着就是功能强大,有USB2和MAC,使得做微型网络服务器成为事实.
STR9是不带MMU的,虽然能Run ucLinux,但没有Porting,也就只好玩uCOS的.
在网上搜索了几下,终于找到了最新的uCOS2.86,下载之,再去官方网站找到ARM Port,放进去Compile,N个Error -_#!
咋回事?原来Porting只是OS部分,还得要BootLoader的支持,不论是ST官方的BootLoader还是Keil ReadView MDK的,都是不适用的,郁闷,只好自己动手丰衣足食的.
我用的是Keil,因为Keil的ULINK2算是便宜(4600大元2个加MDK正版,其实也不便宜的,比起IAR的JLINK就算便宜啦),而且不喜欢IAR,个人认为IAR那个IDE还停留在Win2000年代的界面,没有Keil uVision的好用,而且以前玩过C51,那是Keil的世界,所以还是觉得Keil的更亲切.
说完的题外话,现在言归正传.
都看过MDK和ST的BootLoader后,决定对ST官方版本的BootLoader进行修改,以支持uCOS.
还没见网上有任何uCOS2.8x的STR9移植版本是好用的,所以还得翻阅uCOS官方的文档.
我以前从来没用过uCOS的,花了两天功夫,搞清楚来龙去脉,这下就心里有底的.
关键在于BootLoader的Exception Hander需要由uCOS接管,于是修改向量入口.
Run一下,系统不能进入?Debug也是无效??找找资料,噢~原来连接器需要设置代码位置.
因为ARM需要从0x0启动,增加连接选项"--first 91x_vect.o(Reset)"把BootLoader的Reset如后置为0x0地址即可.
再Run之,系统能进入了,但是任务调度无效,怎么回事?认真Debug发现CPU出现Abort错误,再次阅读BootLoader部分代码,汗,原来默认用了USR Mode,当然出现异常的,因为uCOS用的必须是SVC Mode,改了BootLoader后,一切OK.
事后却发现,只要掉电,系统就再也动不起来的,怎么回事??Try一下别的工程,怎么没此问题?!
郁闷啦~做了一天的研究居然没找到头绪,汗啊.
突然想起是不是代码限制呢?偶用的可是正版,没此限制的哦.不管,观察看看,在线Debug,系统报错是:0x8000地址错误!!这恰好是32KB啊!!不是吧??正版会这样???肯定不是的,一定是那个连接器的问题.
做多几次尝试,再次证实了,只要大于32KB的代码,就会掉电后再也执行不起来的,而且比较Flash区代码,是没问题的,那么可以得出一个结论:MDK不存在32KB代码编译连接的限制.那么一定是文件映像出了问题的.
好好比较MDK的编译连接项,终于发现问题所在"One ELF Section per Function",只要开启这个就一切正常!做了多次测试,证实了这个问题.
在ARM上跑起uCOS后,剩下的东西都变得容易多了.
比较有趣的是STR9的指令集是兼容ARM7的,所以无怪乎称为ARM7的加强版.
玩ARM9也不难的,都是Firmware调用,有点类似API,比起单片机直接操作寄存器方便多的.
不过ARM9的资源就是多呢,玩着就是功能强大,有USB2和MAC,使得做微型网络服务器成为事实.
STR9是不带MMU的,虽然能Run ucLinux,但没有Porting,也就只好玩uCOS的.
在网上搜索了几下,终于找到了最新的uCOS2.86,下载之,再去官方网站找到ARM Port,放进去Compile,N个Error -_#!
咋回事?原来Porting只是OS部分,还得要BootLoader的支持,不论是ST官方的BootLoader还是Keil ReadView MDK的,都是不适用的,郁闷,只好自己动手丰衣足食的.
我用的是Keil,因为Keil的ULINK2算是便宜(4600大元2个加MDK正版,其实也不便宜的,比起IAR的JLINK就算便宜啦),而且不喜欢IAR,个人认为IAR那个IDE还停留在Win2000年代的界面,没有Keil uVision的好用,而且以前玩过C51,那是Keil的世界,所以还是觉得Keil的更亲切.
说完的题外话,现在言归正传.
都看过MDK和ST的BootLoader后,决定对ST官方版本的BootLoader进行修改,以支持uCOS.
还没见网上有任何uCOS2.8x的STR9移植版本是好用的,所以还得翻阅uCOS官方的文档.
我以前从来没用过uCOS的,花了两天功夫,搞清楚来龙去脉,这下就心里有底的.
关键在于BootLoader的Exception Hander需要由uCOS接管,于是修改向量入口.
Run一下,系统不能进入?Debug也是无效??找找资料,噢~原来连接器需要设置代码位置.
因为ARM需要从0x0启动,增加连接选项"--first 91x_vect.o(Reset)"把BootLoader的Reset如后置为0x0地址即可.
再Run之,系统能进入了,但是任务调度无效,怎么回事?认真Debug发现CPU出现Abort错误,再次阅读BootLoader部分代码,汗,原来默认用了USR Mode,当然出现异常的,因为uCOS用的必须是SVC Mode,改了BootLoader后,一切OK.
事后却发现,只要掉电,系统就再也动不起来的,怎么回事??Try一下别的工程,怎么没此问题?!
郁闷啦~做了一天的研究居然没找到头绪,汗啊.
突然想起是不是代码限制呢?偶用的可是正版,没此限制的哦.不管,观察看看,在线Debug,系统报错是:0x8000地址错误!!这恰好是32KB啊!!不是吧??正版会这样???肯定不是的,一定是那个连接器的问题.
做多几次尝试,再次证实了,只要大于32KB的代码,就会掉电后再也执行不起来的,而且比较Flash区代码,是没问题的,那么可以得出一个结论:MDK不存在32KB代码编译连接的限制.那么一定是文件映像出了问题的.
好好比较MDK的编译连接项,终于发现问题所在"One ELF Section per Function",只要开启这个就一切正常!做了多次测试,证实了这个问题.
在ARM上跑起uCOS后,剩下的东西都变得容易多了.