需要确认注册邮箱后才能开通博客,立即确认我的邮箱
文章 搜索 高级搜索 ?3? ?3?
  • 滤波器new!
  • LED驱动 new!
  • 新能源 new!
  • PLL
  • PCIE协议
  • 可穿戴
  • LSI
  • FCI
文章 论坛 博客 小组 研讨会
EDN China>EDN论坛>单片机专区>一线研发之声 之 吐槽C51
?
大家在做什么...
楼主 问题:

一线研发之声 之 吐槽C51

发布时间:2015-10-20 下午2:55

作者: yunxixi

等级: 高级工程师

积分: 2422分

发帖数: 611次

网站总积分: 2432分

2237分

发送消息

加为好友

查看用户的所有发言

查看用户的个人主页

需要确认注册邮箱后才能下载,立即确认我的邮箱
回复后可下载附件
最近有个新手问我,遇到51编译一堆报警 uncall segment。表面上是函数没有调用,但本质上还是51的静态编译所致。我觉得有必要以吐槽的方式好好为菜鸟“出气”一下。

背景知识理解:
这两个背景知识,就是51万恶的根源....


1. 静态栈编译方式:

??连局部变量的地址都是固定的哦。它不是栈压出来的,是编译器他老人家静态分析整个系统树,计算调用深度,运筹帷幄,一次分配给你的。

??所以,一旦有游离在外的uncall,不管是函数还是变量,他老人家就紧张兮兮的,非得给你一个黄牌。遇到函数指针那种严重烧脑的动态调用关系,他老人家就崩溃了。

2. C51的四个bank寄存器组。每个using 数字对应一个个bank。

???效率靠它,bug也靠它。


C51的吐槽点:

1.waning: uncall segment

???不仅是未调用的函数会报Waning,没用到的code也报。
? ?在M3这里,只有static声明的东西没有使用,才会报警。


解决方式:

void uncall_func(void)
{
? ?? ?uint8_t f = 0;
? ?? ?if (f) /* 许多编译器都默许这样的做法,不能吐槽C51暮气昏庸 */
? ???{
? ?? ?? ?? ?As you know
? ???}
}
??


2. using搞不清

??. 不是每个中断要一个单独using,只要优先级不嵌套,用同一个也可以,

??. 一处using处处using, 指定using的函数其所调用的所有子子孙孙,都要using或者NOAREG.

??. 如果要提高某个效率,可单独分配一个bank给它,就是单独的using数字。

???
3. 函数指针:不做死就不会死。


???51的函数指针,形同鸡肋,想用它,就要去了解reentry,重入,搞个动态栈,然后就是做死的节奏。

??我唯一一次用到,是这样写的

???static??const??FUNC_TYPE? ?func =??xxxxxxxxx_function_name;

???告诉你,就这样子,编译器都紧张得要死,老版本也分析不了全局树,还会出错。

???
4. 51的存储类别


xdata/data/code/sbit算是菜鸟能够了解的,加上idata/pdata连我也要爆粗口了

然而其本质上是bus总线访问数据的区别,就是MOV等汇编指令的不同变体。

这方面,还是请个大牛来讲解吧,我目前的理解深度,还没法一气呵成。吐槽无力了

5.大端结构


包括许多老工程师,把51的程序移植到M3后,才发现噩梦其实才刚刚开始。

实际上,许多网络协议,包括自定义的,默认是大端的,我想它的初衷是方便人眼抓包阅读。

但作为一个菜鸟,切不可贪图51的大端便利,写出大小端移植性不好的代码。

不去了解大小端,心里没有度,出来混的,总有还的一天。
?
6.51的三字节指针

void func(char *buf)
{
? ?? ???char *p;
? ?? ? 这里面的buf和p都是三个字节的,你造吗?
}


在一个节约成本不上外部ram的系统中,51里面的每一个byte都很珍贵,了解这个,有助于你提高利用率。

void func(char data *buf)
{
? ?? ? char data *p;
? ?? ?这是两个字节的指针变量。
}

?
附件:
《Keil Software –Cx51 编译器... 下载次数: ?16 资源分:?0

分享到:? 新浪微博 ?? 微信 ??


打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮

1.扫描左侧二维码
2.点击右上角的分享按钮
3.选择分享给朋友
qq空间 ?? 腾讯微博 ?? 人人网 ?? 百度搜藏 ??
?
???标签: 资料下载 c51
yunxixi 编辑于 2015-10-20 下午2:59
引用 回复 收藏 推荐到小组 ( 1) ( 0) 关注

EDN China电子设计技术剖析波士顿动力被弃背后,多足机器人的困境才刚刚开始
第1楼

回复主题:一线研发之声 之 吐槽C51

发布时间:2015-10-20 下午3:09

作者: yunxixi

等级: 高级工程师

积分: 2422分

发帖数: 611次

网站总积分: 2432分

2237分

发送消息

加为好友

查看用户的所有发言

查看用户的个人主页

需要确认注册邮箱后才能下载,立即确认我的邮箱
回复后可下载附件
这篇帖子很不错,写出了初学C51会遇见的诸多问题,和自己当初遇见的是一模一样.
以下谈谈自己的理解:
个人感觉C51是一个很不错的编译器,她在一个RAM很小的单片机上实现了C语言编程.而C51种种不方便的特性,都是根据51单片机的特性量身定制的. 如果你既想使用51核心的单片机,又想使用C语言带来的方便快捷.这些特性就是你应该了解并熟悉的.
就像你看上一位姑娘,又想和人家好,又不想了解人家这怎么行呢?下边来了解了解咱们的姑娘.
说说这些特性的由来(都是根据自己的理解写的,资料不可考证,如有错误请通知).
关于背景:
1 静态栈编译方式:
现在看来C51最不可理喻的地方,恰恰是其当时最先进的地方.正是采用这种编译方式和寄存器传递参数的方式,才使得C语言强大的特性能过在ram只有256字节的单片机上运行的关键.试想如果没有这种编译方式,可能多几层的函数嵌套就会导致堆栈溢出,更别享用C语言的便利了.
2. C51的四个bank寄存器组:
这个是51内核的特性决定的,C51提供了using仅仅是因为更好的为51内核服务.因为51内核有4组R0-R7的寄存器.在汇编语言中可以方便的切换寄存器组,而C51提供using关键字以实现方便快捷的寄存器组切换.
C51的吐槽点:
1.waning: uncall segment
这个报警是因为背景1的原因产生的,对于这种报警一般都是直接忽略或者直接注释掉该程序代码. 楼主给的方法更是相当美观..
2. using搞不清
using在第一次使用失败后弄明白了原因就再也没用过.51核心当时先进的4组寄存器方式,C51用using实现了,只是不明愿意的话,这着时又是一种不便利.
3. 函数指针:不做死就不会死。
这个确实麻烦,这种麻烦的诱因也是背景1.并且背景1还带了了函数不可重入的问题.静态栈编译方式带来的是内存的覆盖,如果重入,函数中当前的变量被覆盖更新,产生不可预知的错误.C51还为函数重入提供了关键字,reetrant,详细情况请百度..
4. 51的存储类别
data,idata,bdata,xdata,pdata,code,bit等存储类别的关键字,这个还是只能怪51提供了多种的寻址方式,并且同时RAM还具有不一样的特性.
data :该关键字指定变量放在内部0x00-0x7f的区域,该区域可以直接寻址;
idata:该关键字指定变量放在内部0x00-0xff的区域,该区域可以间接寻址;
bdata:变量存放在0x20-0x2f的区域,该区域可以位操作;
xdata:变量存贮在外部ram区域,采用movx指令操作;
code:将变量存放于代码区,其实就是常量,采用movc指令操作.
bit:定义位变量,实际存储于0x20-0x2f的区域;
pdata:用于外部变量页寻址(查资料这么说的,没用过).
这些关键字正是针对51的寻址方式及RAM特性提供的,可以方便定义变量并使用.
比如: unsigned char xdata aaa;
该变量存储于外部ram区域,可以直接赋值,直接参与运算,C51编译器会采用自动采用movx读取和存储数据.
5.大端结构
数据的大小端在通讯协议里边如果不加注意,确实会带来比较麻烦的问题,使用时应加以注意.
其实C51的许多吐槽点恰恰是当时其先进的地方,这些特性将C与51单片机完美结合在一起. 技术在进步,在现在M系列的arm芯片中,这些问题都不复存在.新技术使得高级语言与芯片结合的更加紧密.而过去的许多吐槽点说不定就会给现在芯片使用中遇到的问题带来一次解决的启示.C51的出现是一种进步,而C51的使用还仍将继续.
yunxixi 编辑于 2015-10-20 下午3:12
引用 回复
( 0) ( 0)


快速回复 高级回复
用户名:?
美国的游客?????? (您将以游客身份发表,请登陆 | 注册) ?
标题: * 标题还可以输入80
评论: * 你还可以输入30000
验证码: ?*?
分享: 新浪微博?? qq空间?? qq微博?? 人人网?? 百度搜藏??
维护专业、整洁的论坛环境需要您的参与,请及时举报违规帖子,如果举报属实,我们将给予相应的积分奖励。
谢谢您的热心参与!
返回单片机 | 返回专业技术交流区
本论坛仅陈述专家或个人观点,并不代表EDN China 电子技术设计互动社区网站立场。
积分排行榜
彩云 [殿堂级工程师]
mzlr [殿堂级工程师]
特权同学 [殿堂级工程师]
敬请关注EDNC官方微信“edn-china"

每月定期向您递送电子元器件规格书网中的最新元器件数据手册下载、库存信息及技术参数更新。请点击订阅:

2016我的工程师社区
EDN官方QQ群???更多QQ群
  • EDN-深圳 8366025
  • 菜农Cortex-M0技术交流 12047788
  • EDN-哈尔滨 75642591
  • EDN-上海 15156661
  • EDN-广州 57660943
  • EDN-桂林 48813559
  • EDN-武汉 25150805
  • EDN-模拟电路 2837145
  • EDN-通讯 30548292
  • EDN-综合 57490949

促进EDN网友交流合作,方便EDN网友学习沟通

有问题请反馈