打印
[新手园地]

开始把51程序移植到M0,记录差异

[复制链接]
3578|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 | 只看该作者
哦,谢谢提示,

那个函数的控制符有不一样地方?

使用特权

评论回复
5
呆板书生|  楼主 | 2012-5-7 12:14 | 只看该作者
正在修改的程序,原来51的代码,编译后是6K,

现在做一个测试,修改需要多少工作量。

使用特权

评论回复
6
xyz549040622| | 2012-5-7 14:22 | 只看该作者
这个不错,为什么不是uint8_t

使用特权

评论回复
7
王紫豪| | 2012-5-8 01:18 | 只看该作者
支持楼主,这样的对比才真正的有意义,看看我们的 M0 代码压缩率到底怎么样。。另外楼主做了一件具有典型意义的工作,很多人都是从 51 升级到 M0的,他们却很难估算原来的代码能不能放得下。

使用特权

评论回复
8
王紫豪| | 2012-5-8 01:19 | 只看该作者
支持楼主,这样的对比才真正的有意义,看看我们的 M0 代码压缩率到底怎么样。。另外楼主做了一件具有典型意义的工作,很多人都是从 51 升级到 M0的,他们却很难估算原来的代码能不能放得下。

使用特权

评论回复
9
呆板书生|  楼主 | 2012-5-8 12:00 | 只看该作者
已经做完了,最后,代码量 8K。

谢谢王版主的支持

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

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

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

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

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

所谓,磨刀不误砍柴工。

使用特权

评论回复
10
呆板书生|  楼主 | 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
};

不知道怎么做才是最好的

使用特权

评论回复
11
呆板书生|  楼主 | 2012-5-8 12:09 | 只看该作者
奇怪的是,这样定义数组又没问题

const unsigned char tabCommand[] =
{
        'I',        //Initial
        'L',        //Light
        'V',        //Value
};

使用特权

评论回复
12
呆板书生|  楼主 | 2012-5-8 22:13 | 只看该作者
uint32_t 与uint8_t的问题,

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

但arm是32位机,所以,用uint32_t 运算,可能比uint_8快(纯属猜想)

使用特权

评论回复
13
王紫豪| | 2012-5-8 22:59 | 只看该作者
我觉得那个函数指针数组,不用加 static就行

使用特权

评论回复
14
王紫豪| | 2012-5-8 23:00 | 只看该作者
多问一句,原来 51的 bin 多大呢?

使用特权

评论回复
15
触觉的爱| | 2012-5-8 23:47 | 只看该作者
不错不错,楼主继续努力开路,偶后面跟着:P

使用特权

评论回复
16
呆板书生|  楼主 | 2012-5-9 07:54 | 只看该作者
回13楼:
曾经按您的指示,去掉static,还是不行,

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

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

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

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

这样数组,用static,减少耦合性

使用特权

评论回复
17
呆板书生|  楼主 | 2012-5-9 07:54 | 只看该作者
回14楼:

原来的51代码是6K,

使用特权

评论回复
18
呆板书生|  楼主 | 2012-5-13 14:53 | 只看该作者
和51 不一样,C for ARM 中的int 是32位的

使用特权

评论回复
19
呆板书生|  楼主 | 2012-5-15 09:31 | 只看该作者
main 函数

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

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

但arm,一定要写成 int main(void)

使用特权

评论回复
20
X-Hawk| | 2012-5-17 11:46 | 只看该作者
好像这样可以

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

typedef void (*Func)(void);
static const Func tabProF[] =
{
        ProHead,
};

使用特权

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

本版积分规则

30

主题

868

帖子

2

粉丝