智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 11710|回复: 15
打印 上一主题 下一主题

[讨论] 飞思卡尔K60官方IAR例程里为啥要自己实现C语言库

[复制链接]

29

主题

637

帖子

0

精华

常驻嘉宾

我是孤独的赛车手 车手是不需要女人的

Rank: 8Rank: 8

积分
3136
威望
1664
贡献
630
兑换币
621
注册时间
2011-4-16
在线时间
421 小时
跳转到指定楼层
1#
发表于 2013-5-18 01:48:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
同学们如果仔细研究过的话,会发现在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了。。。

29

主题

637

帖子

0

精华

常驻嘉宾

我是孤独的赛车手 车手是不需要女人的

Rank: 8Rank: 8

积分
3136
威望
1664
贡献
630
兑换币
621
注册时间
2011-4-16
在线时间
421 小时
2#
 楼主| 发表于 2013-5-18 01:56:10 | 只看该作者
我突然明白了!因为那些工程文件是IAR和CW兼容的。如果要用__iar_program_start这类的IAR函数,那么对应的CW方面的函数写起来就比较复杂,毕竟可能CW和IAR的链接和启动方式略有不同。所以索性自己从底层实现一个,全部都自己来搞定。只是借你们IAR和CW的编译器用一下。这样只要写好对应的ICF和CW里的芯片配置文件就可以了,请各位大神来讨论!
回复 支持 反对

使用道具 举报

32

主题

978

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2834
QQ
威望
1620
贡献
482
兑换币
1009
注册时间
2012-11-29
在线时间
366 小时
3#
发表于 2013-5-18 02:03:24 | 只看该作者
回复 支持 反对

使用道具 举报

29

主题

637

帖子

0

精华

常驻嘉宾

我是孤独的赛车手 车手是不需要女人的

Rank: 8Rank: 8

积分
3136
威望
1664
贡献
630
兑换币
621
注册时间
2011-4-16
在线时间
421 小时
4#
 楼主| 发表于 2013-5-18 02:36:11 | 只看该作者
dapan945 发表于 2013-5-18 02:03

来讨论一下嘛= =
回复 支持 反对

使用道具 举报

29

主题

637

帖子

0

精华

常驻嘉宾

我是孤独的赛车手 车手是不需要女人的

Rank: 8Rank: 8

积分
3136
威望
1664
贡献
630
兑换币
621
注册时间
2011-4-16
在线时间
421 小时
5#
 楼主| 发表于 2013-5-18 09:14:47 | 只看该作者
回复 支持 反对

使用道具 举报

29

主题

637

帖子

0

精华

常驻嘉宾

我是孤独的赛车手 车手是不需要女人的

Rank: 8Rank: 8

积分
3136
威望
1664
贡献
630
兑换币
621
注册时间
2011-4-16
在线时间
421 小时
6#
 楼主| 发表于 2013-5-18 09:29:48 | 只看该作者
最新测试结果 飞思卡尔写的启动代码会在开始把CPU所有寄存器清零,关闭看门狗等设备,复制中断向量表到内存,然后会调用__iar_data_init3() 进行全局变量的初始化工作。然后官方的启动流程是__iar_program_start()然后__low_level_init()然后再是__iar_data_init3()  __iar_data_init3()会把初始化为0的变量在内存里初始化为0,然后把初始化不为0的变量以及内存函数按照.data_init和.textrw_init的内容复制到内存区域存放。。。
回复 支持 反对

使用道具 举报

32

主题

978

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2834
QQ
威望
1620
贡献
482
兑换币
1009
注册时间
2012-11-29
在线时间
366 小时
7#
发表于 2013-5-18 09:53:01 | 只看该作者
说得很对。还有一点就是编译器提供的启动代码不一定很适合,有可能有BUG。
回复 支持 反对

使用道具 举报

29

主题

637

帖子

0

精华

常驻嘉宾

我是孤独的赛车手 车手是不需要女人的

Rank: 8Rank: 8

积分
3136
威望
1664
贡献
630
兑换币
621
注册时间
2011-4-16
在线时间
421 小时
8#
 楼主| 发表于 2013-5-18 09:57:56 | 只看该作者
dapan945 发表于 2013-5-18 09:53
说得很对。还有一点就是编译器提供的启动代码不一定很适合,有可能有BUG。

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



回复 支持 反对

使用道具 举报

32

主题

978

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2834
QQ
威望
1620
贡献
482
兑换币
1009
注册时间
2012-11-29
在线时间
366 小时
9#
发表于 2013-5-18 10:18:15 | 只看该作者
fmadot 发表于 2013-5-18 09:57
其实两个我看下来差不多。飞思卡尔就是自己实现了一些库,不过没有看到math等库,估计还是要用IAR提供的。 ...

提到野火我想问一句这是怎么回事?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

29

主题

637

帖子

0

精华

常驻嘉宾

我是孤独的赛车手 车手是不需要女人的

Rank: 8Rank: 8

积分
3136
威望
1664
贡献
630
兑换币
621
注册时间
2011-4-16
在线时间
421 小时
10#
 楼主| 发表于 2013-5-18 12:30:22 | 只看该作者
dapan945 发表于 2013-5-18 10:18
提到野火我想问一句这是怎么回事?

什么问题?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-6-16 02:44 , Processed in 0.059343 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表