打印
[菜农助学交流]

【第五期】自己写函数库

[复制链接]
2800|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wangqy_ic|  楼主 | 2011-12-28 20:01 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 wangqy_ic 于 2011-12-28 20:03 编辑

大家现在写程序,是不是都是用新唐提供的函数库?在体验开发板的一开始,我也是使用函数库,毕竟这个太方便了。
可是有一天,我发现一个只使用时钟和IO以及调试串口的程序居然查过了16k的时候,我震惊了!!!天啊,这么一个简单的功能,需要这么多的程序空间吗???
抱着怀疑的态度,我读了新唐提供的库。看完后,一个字:大!这个大是指功能全,副作用就是代码太多了,生成的程序代码当然就小不下来。

我把学51的精神拿出来了,我自己写驱动!

我知道这个过程是非常漫长,也是非常无趣的,但是这个工程绝对是学习芯片的最佳途径!

书接上文,我这开始写的驱动是RTC、串口、按键和LED驱动。

代码就不贴了,我的注释也写的比较全。直接上代码吧。
下面这行是KEIL编译后的代码统计:
Program Size: Code=3340 RO-data=224 RW-data=104 ZI-data=1120  



看到了吗,Code=3340,这个与使用函数库可不是一个数量级的。

这个只是一个开始,我的目标是把日常使用的外设驱动都写完。

附件是这个keil的工程,是 4.22版本的Keil。
最后,新年到了祝各位网友新年快乐……

ps:可能有网友会提出这样的工作没有实际的意义,其实我觉得,如果是一个公司或这团体,完善自己的驱动库,才是王道啊!而且这样的积累,当形成量以后,绝对是好东西!!!

nuc120.zip

13.85 KB

相关帖子

沙发
john_lee| | 2011-12-28 20:41 | 只看该作者
赞一个。

使用特权

评论回复
板凳
zxcscm| | 2011-12-28 21:12 | 只看该作者
技术贴 顶

使用特权

评论回复
地板
hotpower| | 2011-12-28 21:15 | 只看该作者
鼓励,加入选美~~

使用特权

评论回复
5
Swallow_0322| | 2011-12-29 07:46 | 只看该作者
顶!

使用特权

评论回复
6
yanding708811| | 2012-1-5 23:05 | 只看该作者
顶,很是羡慕!

使用特权

评论回复
7
wjsjdeng| | 2012-1-6 17:26 | 只看该作者
ps:可能有网友会提出这样的工作没有实际的意义,其实我觉得,如果是一个公司或这团体,完善自己的驱动库,才是王道啊!而且这样的积累,当形成量以后,绝对是好东西!!!

同意一楼的观点,我们公司现在也是把程序做成库,驱动库,通讯协议库,公共操作库,,然后放到vss,发现问题了,改了后大家就都改好了。

使用特权

评论回复
8
wjsjdeng| | 2012-1-6 17:26 | 只看该作者
ps:可能有网友会提出这样的工作没有实际的意义,其实我觉得,如果是一个公司或这团体,完善自己的驱动库,才是王道啊!而且这样的积累,当形成量以后,绝对是好东西!!!

同意一楼的观点,我们公司现在也是把程序做成库,驱动库,通讯协议库,公共操作库,,然后放到vss,发现问题了,改了后大家就都改好了。

使用特权

评论回复
9
呆板书生| | 2012-1-6 19:45 | 只看该作者
两个问题,

一,51年代,如果某些函数没有调用的话,连接的时候是会提示L16警告,提示那些是没用到,到了ARm版本,如果某些函数没有调用的话,连接的时候是不会提示

二,实际很多驱动的有多余的代码,比如IO中,有个大家很喜欢用的DrvGPIO_SetBit函数,查看这个函数,发现这个函数的返回值永远是 E_SUCCESS,这个做的汇编代码虽然是一条指令,但有必要吗?

使用特权

评论回复
10
呆板书生| | 2012-1-8 10:50 | 只看该作者
和楼主讨论一下;

在RTC文件中,有这么一个函数

void RTC_IRQHandler(void)
{   
        if (RTC->RIIR.TIF)
        {
        RTC->RIIR.TIF = 1;
        
        led_ctrl(3, RTC->TLR.SEC1 & 1);
    }
       
        if (RTC->RIIR.AIF)
        {
                RTC->RIIR.AIF = 1;
        }
}

其中:
        if (RTC->RIIR.TIF)
        {
        RTC->RIIR.TIF = 1;

这样的语句是什么意思?

使用特权

评论回复
11
wangqy_ic|  楼主 | 2012-2-9 19:34 | 只看该作者
两个问题,

一,51年代,如果某些函数没有调用的话,连接的时候是会提示L16警告,提示那些是没用到,到了ARm版本,如果某些函数没有调用的话,连接的时候是不会提示

二,实际很多驱动的有多余的代码,比如IO中,有 ...
呆板书生 发表于 2012-1-6 19:45


不好意思,节前节后这段时间有点忙,一直没能上论坛交流。
对于1,我也发现了,确实没有提示没有使用到的函数。
对于2,我认为这个是api接口统一的体现,没有实际的作用。

使用特权

评论回复
12
wangqy_ic|  楼主 | 2012-2-9 19:35 | 只看该作者
和楼主讨论一下;

在RTC文件中,有这么一个函数

void RTC_IRQHandler(void)
{   
        if (RTC->RIIR.TIF)
        {
        RTC->RIIR.TIF = 1;
        
        led_ctrl(3, RTC->TLR.SEC1 & 1);
    }
        
        if (RTC->RIIR. ...
呆板书生 发表于 2012-1-8 10:50


写入1是为了清除该中断。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

17

主题

98

帖子

4

粉丝