发新帖本帖赏金 0.10元(功能说明)我要提问
1234下一页
返回列表
打印
[51单片机]

一线研发之声 之 吐槽51谁能解?

[复制链接]
10117|77
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
sedatefire|  楼主 | 2014-12-16 11:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 sedatefire 于 2014-12-17 01:31 编辑

缘起:
前阵子,在博客写个了跑马灯变形记,小火了下,六篇连载霸占了博客热度前六。可惜评论很少,所以这次决定写在论坛里。我在那个博客尾巴留了QQ号,倒是蛮多人加我询问的。最近有个新手问我,遇到51编译一堆报警 uncall segment。表面上是函数没有调用,但本质上还是51的静态编译所致。我觉得有必要以吐槽的方式好好为菜鸟“出气”一下,遂有此文。虽我是新手园地版主,但我觉得这个主题还是放在侃单片机论坛,比较能够得到有价值的共鸣,来佐证我的笔误,毕竟两三年没碰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.应该还有很多,但我真心忘却了。
  
菜鸟大虾们,来尽情吐槽吧...   诸位牛人也会有很强的解答欲望。


   

打赏榜单

dirtwillfly 打赏了 0.10 元 2015-07-02

评分
参与人数 1威望 +10 收起 理由
dwh000 + 10 很给力!

相关帖子

沙发
sedatefire|  楼主 | 2014-12-16 12:10 | 只看该作者
本帖最后由 sedatefire 于 2014-12-25 10:41 编辑

再加一个,51的三字节指针
void func(char *buf)
{
        char *p;
       这里面的buf和p都是三个字节的,你造吗?
}
在一个节约成本不上外部ram的系统中,51里面的每一个byte都很珍贵,了解这个,有助于你提高利用率。
void func(char data *buf)
{
       char data *p;
      这是两个字节的指针变量。
}

我会定期刷新这个页面,添加诸位的吐槽点。

使用特权

评论回复
板凳
autopccopy| | 2014-12-16 12:47 | 只看该作者
顶! 一起学习C51!

使用特权

评论回复
地板
ddc21ic| | 2014-12-16 12:49 | 只看该作者
静态栈?

使用特权

评论回复
5
wuhaiduo| | 2014-12-16 14:30 | 只看该作者
看来要对编译器和编译原理很懂才能搞明白
有点拨开云雾的感觉

使用特权

评论回复
6
慢慢学| | 2014-12-16 15:05 | 只看该作者
为什么不说变量呢??

使用特权

评论回复
7
sedatefire|  楼主 | 2014-12-16 16:10 | 只看该作者
慢慢学 发表于 2014-12-16 15:05
为什么不说变量呢??

变量不单属于51的吐槽点

使用特权

评论回复
8
cuya| | 2014-12-16 22:44 | 只看该作者
51 也就适合做一些低成本, 简单的控制类项目, 而且历史原因, 51 CPU 的存储器结构非常糟糕, 因而一些所谓的软件设计技术在 51 基本上没有什么意义。

使用特权

评论回复
9
sedatefire|  楼主 | 2014-12-17 01:12 | 只看该作者
5.大端结构
包括许多老工程师,把51的程序移植到M3后,才发现噩梦其实才刚刚开始。
实际上,许多网络协议,包括自定义的,默认是大端的,我想它的初衷是方便人眼抓包阅读。
但作为一个菜鸟,切不可贪图51的大端便利,写出大小端移植性不好的代码。
不去了解大小端,心里没有度,出来混的,总有还的一天。

使用特权

评论回复
10
sedatefire|  楼主 | 2014-12-17 01:17 | 只看该作者
求加酷,加精,这是另一种方式来推广C51的盲点,版主你懂的
客场作战,就是这个不利
还是发在新手园地,自己加精好了

使用特权

评论回复
11
sedatefire|  楼主 | 2014-12-17 01:24 | 只看该作者
自己再加一个,典型51的外扩ram总线16位,扣除片选线,最多只能外扩32K的xdata?
请硬件工程师吐槽吧
这个自觉好像有点口误...

使用特权

评论回复
12
sedatefire|  楼主 | 2014-12-17 01:30 | 只看该作者
反响平平,干脆改个贴名

一线研发之声 之 C51那些事儿,为菜鸟吐槽,老鸟代言
改成
一线研发之声 之 吐槽51谁能解?

诱发一些大牛的战斗欲

使用特权

评论回复
13
link8001| | 2014-12-17 08:24 | 只看该作者
自行车速度慢,骑起来累,但还是有人骑,为啥?简单啊

使用特权

评论回复
评论
autopccopy 2014-12-19 13:13 回复TA
顶!我们一直将51等8位单片机比喻为自行车,哪怕有汽车、飞机,自行车还是存在的! 
评分
参与人数 1威望 +3 收起 理由
autopccopy + 3 顶!我们一直将51等8位单片机比喻为自行车.
14
Imakey| | 2014-12-17 08:25 | 只看该作者
小白求科普,大端??小端???

使用特权

评论回复
15
angus118| | 2014-12-17 09:09 | 只看该作者
强大的C51

使用特权

评论回复
16
生无所息1| | 2014-12-17 09:15 | 只看该作者

使用特权

评论回复
17
請放心遠行!| | 2014-12-17 10:12 | 只看该作者
强大的五一

使用特权

评论回复
18
ayb_ice| | 2014-12-17 10:27 | 只看该作者
大小端哪有那么可怕,
可怕的是有些人压根不知道还有这说法,用法

使用特权

评论回复
19
大秦正声| | 2014-12-17 10:50 | 只看该作者
link8001 发表于 2014-12-17 08:24
自行车速度慢,骑起来累,但还是有人骑,为啥?简单啊

不堵车还环保

使用特权

评论回复
20
chailiyh| | 2014-12-17 11:06 | 只看该作者
本帖最后由 chailiyh 于 2014-12-17 11:17 编辑
Imakey 发表于 2014-12-17 08:25
小白求科普,大端??小端???

百度了一下,是类似数据起始位/左对齐/右对齐之类的吧。
设寄存器里直接读出的数据是0001,这个数据在一些片子里实际是1000=8,在另一些片子里是0001=1。
LZ 是么?
(这东西遇到过也就遇到了,遇不到可能真就不知道了。大牛不也是一点一点烧片子烧出来的么- -)

使用特权

评论回复
发新帖 本帖赏金 0.10元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:我为我自己代言... 链接:一线研发之声系列汇集 链接:Sedatefire的笔记 我发心,待人

4392

主题

5934

帖子

32

粉丝