[新手园地] 开始把51程序移植到M0,记录差异

[复制链接]
4538|22
 楼主| 呆板书生 发表于 2012-5-7 11:15 | 显示全部楼层 |阅读模式
序言;把一个51的程序完整移植到M0,
不是为了好玩,而是为下一步的工作,
用九歌的话说,就是为房子、车子、和票子,不过是不远的将来

-------------------------------------------------------------
1.把所有程序的最后一行加一个空行,虽然不加其实也没错,但总被keil提示出错
2.把所有的没有参数的函数都加(void),不知道为啥,如果不加,keil总提示类型错
 楼主| 呆板书生 发表于 2012-5-7 11:40 | 显示全部楼层
3.修改51特有的数据类型,
    把bit 改为uint_32 t
    把 idata,data,xdata,pdata等取消
    把code 类改为 const 类
mohanwei 发表于 2012-5-7 11:50 | 显示全部楼层
注意一下printf函数族的控制符……
 楼主| 呆板书生 发表于 2012-5-7 12:12 | 显示全部楼层
哦,谢谢提示,

那个函数的控制符有不一样地方?
 楼主| 呆板书生 发表于 2012-5-7 12:14 | 显示全部楼层
正在修改的程序,原来51的代码,编译后是6K,

现在做一个测试,修改需要多少工作量。
xyz549040622 发表于 2012-5-7 14:22 | 显示全部楼层
这个不错,为什么不是uint8_t
王紫豪 发表于 2012-5-8 01:18 | 显示全部楼层
支持楼主,这样的对比才真正的有意义,看看我们的 M0 代码压缩率到底怎么样。。另外楼主做了一件具有典型意义的工作,很多人都是从 51 升级到 M0的,他们却很难估算原来的代码能不能放得下。
王紫豪 发表于 2012-5-8 01:19 | 显示全部楼层
支持楼主,这样的对比才真正的有意义,看看我们的 M0 代码压缩率到底怎么样。。另外楼主做了一件具有典型意义的工作,很多人都是从 51 升级到 M0的,他们却很难估算原来的代码能不能放得下。
 楼主| 呆板书生 发表于 2012-5-8 12:00 | 显示全部楼层
已经做完了,最后,代码量 8K。

谢谢王版主的支持

但我并不想考虑代码量的问题,代码量有很多种可能,比如M0要设置时钟,有一堆时钟设置代码,而51肯定没有了这堆代码

而如果一个程序中有一堆字库代码和显示字符串,那用什么型号的MCU,那部分的代码量都是不变的

上次做nuc120的USB模拟COM,不上USB模块,代码量立马少了4K,整整一个80C51的代码量

我印象最深刻的是,很多很多年以前,我搞的一个省级单位的数据管理程序,那时候的机器只有256KRAM,dos可以用一个360K的软盘启动就够了,用一个10M的硬盘存放数据,还觉得很奢侈。现在,这个内存配置,光一个启动windows都远远不够,跑题了

但现在技术发展已经是让我们在代码量方面少花脑筋
--------------------------------
对比差异,在于注意一些细节,一些在51能实现的,但arm上要修改的才能用,

所谓,磨刀不误砍柴工。
 楼主| 呆板书生 发表于 2012-5-8 12:06 | 显示全部楼层
继续:

51的数据,如果放在ROM中,定义的时候需要加 code去修饰,

arm,则用 const修饰,

但如果指针呢?

一堆函数指针数据,在51时候,我是这样定义
static code void(* tabProF[])(void)=
{
        ProHead,
        ProLength,
        ProSerID,
        ProCommand,
        ProPara,
        ProCheckSum,
        ProEnd
};

换到arm的时候,我想当然就换成这样,结果编译出错
static const void(* tabProF[])(void)=
{
        ProHead,
        ProLength,
        ProSerID,
        ProCommand,
        ProPara,
        ProCheckSum,
        ProEnd
};

不知道怎么做才是最好的
 楼主| 呆板书生 发表于 2012-5-8 12:09 | 显示全部楼层
奇怪的是,这样定义数组又没问题

const unsigned char tabCommand[] =
{
        'I',        //Initial
        'L',        //Light
        'V',        //Value
};
 楼主| 呆板书生 发表于 2012-5-8 22:13 | 显示全部楼层
uint32_t 与uint8_t的问题,

从空间来说,uint32_t比uint8_t占的位置多,

但arm是32位机,所以,用uint32_t 运算,可能比uint_8快(纯属猜想)
王紫豪 发表于 2012-5-8 22:59 | 显示全部楼层
我觉得那个函数指针数组,不用加 static就行
王紫豪 发表于 2012-5-8 23:00 | 显示全部楼层
多问一句,原来 51的 bin 多大呢?
触觉的爱 发表于 2012-5-8 23:47 | 显示全部楼层
不错不错,楼主继续努力开路,偶后面跟着:P
 楼主| 呆板书生 发表于 2012-5-9 07:54 | 显示全部楼层
回13楼:
曾经按您的指示,去掉static,还是不行,

函数指针数组是一个命令的跳转,代替switch 中大量的 case 语句,

在51的时候,如果用函数指针,放在code是最好的,因为指针也要占地方,51的Ram少,就让它放在code

但在arm的时候,不知道该如何写,

static其实是必要的,不同的模块之间,我有可能写很多switch,我喜欢用switch,尽量少写if,特别是状态机的时候

这样数组,用static,减少耦合性
 楼主| 呆板书生 发表于 2012-5-9 07:54 | 显示全部楼层
回14楼:

原来的51代码是6K,
 楼主| 呆板书生 发表于 2012-5-13 14:53 | 显示全部楼层
和51 不一样,C for ARM 中的int 是32位的
 楼主| 呆板书生 发表于 2012-5-15 09:31 | 显示全部楼层
main 函数

所有的C程序都是有一个函数叫main

但不知道为啥,函数返回值是 int类型,书生从来不知道那个函数该返回一个什么值,所以在51的时候永远写,void main()

但arm,一定要写成 int main(void)
X-Hawk 发表于 2012-5-17 11:46 | 显示全部楼层
好像这样可以

  1. static void(* const tabProF[])(void)=
  2. {
  3.         ProHead,
  4. };
不过说实在,对C语言这个所谓的“左右规则”的定义,一直云里雾里,
所以更喜欢用typedef,不会出错

  1. typedef void (*Func)(void);
  2. static const Func tabProF[] =
  3. {
  4.         ProHead,
  5. };
您需要登录后才可以回帖 登录 | 注册

本版积分规则

30

主题

868

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部