打印
[ZLG-ARM]

keil+ulink+lpc23xx的几个问题.贵宾: computer00 hotpower zlgarm

[复制链接]
2405|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
shkliu|  楼主 | 2007-3-2 08:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
软件:没有操作系统,从keil的例子改的。
硬件:lpc2378,自己做的2层板。
贵宾: computer00 hotpower zlgarm

1。解释一下realviwe 和 carm在建立工程前选择的,有什么区别呢?
2。比较奇怪:不知道下面的描述是不是清楚:)
   系统有一个timer0 ,10ms。uart0输出一些程序运行信息。
static uint32 timer_cnt;   
void timer0_isr() __irq{
        IENABLE;
        timer_cnt++;
        IDISABLE;
}
开始如果启动定时器,uart一直启动。程序就会在运行到malloc(另外一个初始化程序)就去了Dabt异常了。
最后看到了hotpower兄还是谁给别人的回复,我加上了static volatile uint32 timer_cnt; 结果定时器可以启动了。但是我又有一个问题3。高兴。。以为问题解决了:) 结果:( 我发现有时候我的程序加了一行uart_print之类的;而且不是在中断服务程序里面。就又出现了怪问题,malloc之前就去了异常了。
3。我没有选择编译器优化,还需要volatile吗?
4。zlg315说23xx,4月份有第二版,那第一版就是有问题了,我碰到的该不会芯片bug?? 第一版已知的bug是什么呢?
我试验了malloc是没有问题的。
多谢!

相关帖子

沙发
computer00| | 2007-3-2 09:14 | 只看该作者

re

1.看看这个,就在第一个图里面,先选择好你要的编译器,然后再来建立工程。建立好工程之后,配置好选项。
http://computer00.21ic.org/user1/2198/archives/2006/16425.html


2.不知道回答什么,去了data异常,一般是指针越界,也有可能是程序跑飞。

3.不管你有没有开编译器优化,该需要volatile的地方就得要加,不能存在侥幸心理。

使用特权

评论回复
板凳
shkliu|  楼主 | 2007-3-2 09:30 | 只看该作者

多谢!

1,那个我看过了,直到步骤,但是为什么选择carm而不是realview?我下载的例子使用的realview 选择了 安装路径bin。
2。我也是有点摸不找头脑,所以请高手帮忙分析一下。我使用unlink在flash里面仿真,碰到了那个malloc如果run over就不行一下子到了异常,run into就可以过去到下一句。

使用特权

评论回复
地板
xyele| | 2007-3-2 09:37 | 只看该作者

在这些系统最好自己写malloc函数,定位到固定内存块

使用特权

评论回复
5
computer00| | 2007-3-2 09:48 | 只看该作者

是自由选择啊,没有为什么。

就像你吃饭打菜一样,自己喜欢挑什么就挑什么了。


也许是你的内存设置不对吧。听很多人说自带的malloc有问题,不过我没用过,不清楚了。

使用特权

评论回复
6
shkliu|  楼主 | 2007-3-2 10:14 | 只看该作者

malloc我也看过了,简单的可以,如果

频繁调用malloc free,那么产生了碎片怎么做阿,我觉得太复杂了:(

内存设置?我非配了比较大的堆栈。第一个malloc只申请了64字节,我想应该不回有问题。不知道00兄内存还需要怎么设置阿?

使用特权

评论回复
7
computer00| | 2007-3-2 10:18 | 只看该作者

这个我就不清楚了,也许你需要读读keil的帮助手册

如果你的内存够用的话,最好使用静态分配法,尽量减少内存分配和释放的次数。

使用特权

评论回复
8
shkliu|  楼主 | 2007-3-2 10:25 | 只看该作者

malloc也使不得不用的。

无法避免不用。
比较奇怪的就是 为什么step into可以正常的过去,step over不行呢?是不是运行太快了? 
#define PLL_MValue    38
#define PLL_NValue    2
#define CCLKDivValue    4
#define Fosc     11059200
#define Fcclk     32768*150*12
#define Fcco    Fosc*2*(PLL_MValue+1)/(PLL_NValue+1) /*<290*/

使用特权

评论回复
9
computer00| | 2007-3-2 10:29 | 只看该作者

有可能。你将时钟速度降下来试试

以前我试过一次单步可,全速不行,是因为在中断里面某些语句后面少了nop指令。

使用特权

评论回复
10
shkliu|  楼主 | 2007-3-2 10:43 | 只看该作者

我现在在调。

nop你说在中断里面加。我还没有进中断呢,在第一个malloc全速的时候就异常。
开始我以为malloc分配的时候不能中断呢,原来那个时候timer中断还没有到。

使用特权

评论回复
11
shkliu|  楼主 | 2007-3-2 11:40 | 只看该作者

????

error====================
    60: Re:    xxx = malloc( cc );  
0x0000B9FC  E1A00009  MOV       R0,R9
0x0000BA00  EB003304  BL        0x00018618
0x0000BA04  E1A0A000  MOV       R10,R0

ok=======================
    60:     __asm{NOP};    
0x0000B9FC  E1A00000  NOP       
    62: Re:    xxx = malloc( cc ); 
0x0000BA00  E1A00009  MOV       R0,R9
0x0000BA04  EB003306  BL        0x00018624
0x0000BA08  E1A0A000  MOV       R10,R0

上面那个step into到BL 0x0018618可以进去,也可以出来。如果直接运行到MOV R10,R0就异常。

下面这个ok。我发现不相同的就是malloc在flash中的地址了。 

两个程序的区别就是增加了一个__asm(NOP);

不知道什么原因?是不是芯片bug阿?

使用特权

评论回复
12
hotpower| | 2007-3-3 01:23 | 只看该作者

不喜欢用malloc(),用动态数组简单些

int xxx (void) {
char str[512], s[16];
    sprintf(str, "我%d次倒塌了~~~", Iap.result[1]);
    Uart.puts(str);
//..........
}

使用特权

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

本版积分规则

25

主题

96

帖子

0

粉丝