智能车制作

标题: 飞思卡尔K60官方IAR例程里为啥要自己实现C语言库 [打印本页]

作者: fmadot    时间: 2013-5-18 01:48
标题: 飞思卡尔K60官方IAR例程里为啥要自己实现C语言库
同学们如果仔细研究过的话,会发现在IAR的example里除了Getting Started,其他的都是飞思卡尔给的例程。这里面飞思卡尔自己实现了assert 自己实现了stdlib里的功能,比如malloc等。很好奇。。。到底是什么驱使飞思卡尔这么干的。难道他们觉得IAR提供的DLIB不好吗? 不过顺便提一句飞思卡尔提供的printf不错。。。发现和我当时自己写的printf基本上代码结构一模一样= ={:soso_e144:} 难道我和那位飞思卡尔的工程师心有灵犀啊~{:soso_e137:}
而且飞思卡尔还就不肯用IAR提供的__iar_program_start()作为复位向量指向的函数,偏要自己写一个复位函数自己把向量表复制到内存里。。。。难道__low_level_init里写就不行嘛~ 偏要搞得不一样多不好~  所以我决定还是按照IAR的标准来开发,不过借鉴一下飞思卡尔提供的0x0到0x410的那个中断向量表以及isr.h。。。省得以后每次写入flash都会锁住芯片。{:soso_e120:}{:soso_e104:}

或许是飞思卡尔觉得一个例程要把一整个DLIB模块编译进去太浪费了?或许吧。。。。反正我是决定用IAR的DLIB了。。。

作者: fmadot    时间: 2013-5-18 01:56
我突然明白了!因为那些工程文件是IAR和CW兼容的。如果要用__iar_program_start这类的IAR函数,那么对应的CW方面的函数写起来就比较复杂,毕竟可能CW和IAR的链接和启动方式略有不同。所以索性自己从底层实现一个,全部都自己来搞定。只是借你们IAR和CW的编译器用一下。这样只要写好对应的ICF和CW里的芯片配置文件就可以了,请各位大神来讨论!
作者: dapan945    时间: 2013-5-18 02:03

作者: fmadot    时间: 2013-5-18 02:36
dapan945 发表于 2013-5-18 02:03

来讨论一下嘛= =

作者: fmadot    时间: 2013-5-18 09:14

作者: fmadot    时间: 2013-5-18 09:29
最新测试结果 飞思卡尔写的启动代码会在开始把CPU所有寄存器清零,关闭看门狗等设备,复制中断向量表到内存,然后会调用__iar_data_init3() 进行全局变量的初始化工作。然后官方的启动流程是__iar_program_start()然后__low_level_init()然后再是__iar_data_init3()  __iar_data_init3()会把初始化为0的变量在内存里初始化为0,然后把初始化不为0的变量以及内存函数按照.data_init和.textrw_init的内容复制到内存区域存放。。。
作者: dapan945    时间: 2013-5-18 09:53
说得很对。还有一点就是编译器提供的启动代码不一定很适合,有可能有BUG。
作者: fmadot    时间: 2013-5-18 09:57
dapan945 发表于 2013-5-18 09:53
说得很对。还有一点就是编译器提供的启动代码不一定很适合,有可能有BUG。

其实两个我看下来差不多。飞思卡尔就是自己实现了一些库,不过没有看到math等库,估计还是要用IAR提供的。蛋疼咯~因为IAR手册里对启动写得挺详细的,所以还是准备用IAR的方式了。 另外野火的启动方式里就是把飞思卡尔的启动方式再改了一下。。。把原来调用__iar_data_init3()的改成了在common_startup()里自行复制初始化那些变量。感觉有点多次一举。即使按照野火提供的ICF文件里提到的要把对flash操作的函数复制到ram里,只要把函数用__ramfunc申明就可以了,iar启动代码里也会自动复制到ram里的,所以感觉很多余= = 求火哥来解释一下~ @野火{:soso_e103:}




作者: dapan945    时间: 2013-5-18 10:18
fmadot 发表于 2013-5-18 09:57
其实两个我看下来差不多。飞思卡尔就是自己实现了一些库,不过没有看到math等库,估计还是要用IAR提供的。 ...

提到野火我想问一句这是怎么回事?[attach]45864[/attach][attach]45863[/attach]

作者: fmadot    时间: 2013-5-18 12:30
dapan945 发表于 2013-5-18 10:18
提到野火我想问一句这是怎么回事?

什么问题?

作者: 野火    时间: 2013-6-22 16:47
本帖最后由 野火 于 2013-6-22 16:55 编辑
fmadot 发表于 2013-5-18 09:57
其实两个我看下来差不多。飞思卡尔就是自己实现了一些库,不过没有看到math等库,估计还是要用IAR提供的。 ...

我们没有用 __iar_program_start ,他会把全局变量清空,而如果我们使用__iar_program_start,会在 __iar_program_start 前调用 PLLL初始化,保存一些全局变量,以便后面的模块自行计算频率,便于上层调用,但__iar_program_start会把我们的数据给删掉。

所以我们直接用飞思卡尔的启动代码,可以看到源代码,比较容易熟悉底层。

另外,我调试时,如果用 __iar_program_start 后,调用 set_sys_dividers 会出现硬件上访,我也懒得深入研究。

你个人喜欢 用  __iar_program_start  ,没必要说别人多此一举 ,毕竟考虑的情况不一样。



作者: fmadot    时间: 2013-6-30 22:36
野火 发表于 2013-6-22 16:47
我们没有用 __iar_program_start ,他会把全局变量清空,而如果我们使用__iar_program_start,会在 __iar ...

哦 原来你们是这么做的 了解了
作者: m__dd    时间: 2014-3-23 11:43
中断向量表复制不应该是0x410吧,应该是0x260才对吧
作者: 逆袭队    时间: 2014-7-9 00:05

作者: horizon_z40    时间: 2014-8-6 15:29
请问下官方例程在哪儿下载
作者: 竹音清影    时间: 2014-8-6 21:13
底层完全不懂。




欢迎光临 智能车制作 (http://dns.znczz.com/) Powered by Discuz! X3.2