打印

求教如何在KEIL里面看外部RAM变量内容?

[复制链接]
7755|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
endlessss|  楼主 | 2008-5-12 16:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
目前使用的KEIL C166 5.05  MCU 为XC164CS + 32K SRAM
DEBUG TOOL: U-LINK
外部RAM中的变量使用指定地址方式定义
#define        DaFlash  ((struct DATAFLASHRAM volatile far*) 0x014000)
#define     TS         ((struct TEST_RAM volatile far *) 0x010000)
#define        Sram      ((struct SRAM volatile far *) 0x010000)
这几个机构体都非常巨大,基本上都是10K左右。
求教如何查看外部RAM中变量的值,例如Sram->MasInfo.ContrWord.
谢谢

相关帖子

沙发
endlessss|  楼主 | 2008-5-14 07:48 | 只看该作者

难道大家都不用这个功能吗?

怎么没人说话,难道大家都不用这个功能吗?

使用特权

评论回复
板凳
农民讲习所| | 2008-5-14 09:23 | 只看该作者

一般不会对变量绝对定位的

99.999%都是自动定位,最多指定RAM区域。

使用特权

评论回复
地板
computer00| | 2008-5-14 09:35 | 只看该作者

是的,通常是直接定义一个结构,让编译器自动分配空间。

你这样的话,可以定义一个这样的结构体指针变量,然后把这个指针赋给它,然后再拿这个结构体指针变量就可以看到了。
或者直接看内存窗口,指定到那个地址就行了,不过这样就没有了结构体成员的信息。

使用特权

评论回复
5
endlessss|  楼主 | 2008-5-14 09:44 | 只看该作者

由于

由于內部RAM的读写周期要比外部RAM快很多,所以都把使用频繁的变量定义在本地RAM,而把一些不常用的变量定义在外部RAM.但是在外部RAM定义的变量在WAITCH WINDOW里面监测内容时,其显示为"?????".此为不知如何检测外部RAM中变量的数值。
同一个PROJ编译完成后,将烧录档案使用其他方式烧录(通过BOOTLOAD用串口烧录)运行状况一些正常。然而使用keil+ulink的方式烧录,跑起来就是怪怪的,好像有些外部SRAM的内容读写有误。不知各位大侠是否有遇到类似的状况。

谢谢楼上!

使用特权

评论回复
6
endlessss|  楼主 | 2008-5-14 09:51 | 只看该作者

HEHE

电脑圈圈的方法我也有试过,由于本地RAM定义变量我都可以监控。所以我定义了一些本地的测试变量,例如TS_1,然后将外部RAM定义的变量Sram->MasInfo.ContrWord的值赋给TS_1.最好直接监控TS_1的值。

使用特权

评论回复
7
农民讲习所| | 2008-5-14 09:52 | 只看该作者

volatile去掉。

far struct DATAFLASHRAM DaFlash; 就可以了。


使用特权

评论回复
8
农民讲习所| | 2008-5-14 09:53 | 只看该作者

volatile是定义端口和共享变量用的。

一般变量不要用。

使用特权

评论回复
9
endlessss|  楼主 | 2008-5-14 10:18 | 只看该作者

编译不过,

改成 far struct DATAFLASH DaFlash,编译不过了。
我改了个版本,所有的RAM区由KEIL分配。但是结果还是一样,监控外部RAM时仍然显示“????”。

使用特权

评论回复
10
农民讲习所| | 2008-5-14 10:23 | 只看该作者

你把far的位置调整下试试

使用特权

评论回复
11
农民讲习所| | 2008-5-14 10:24 | 只看该作者

是什么错误?

列一条相关的警告看看

使用特权

评论回复
12
endlessss|  楼主 | 2008-5-14 10:52 | 只看该作者

qingjiao

目前定义的方式是这样的?
在.h文件中定义结构体
struct DATAFLASH
{
....
};
然后使用下列语句制定其地址为0x010000
#define    DaFlash (( struct DATAFLASHRAM  far*) 0x010000)

所以所有的东西都在.h文件里面。

请教要怎么改。
在.c文件 定义far struct DATAFLASHRAM DaFlash,.h文件要怎样声明。
非常感谢您的帮助。

使用特权

评论回复
13
endlessss|  楼主 | 2008-5-14 16:47 | 只看该作者

目前使用電腦圈圈的辦法

用可以用,只是很累啊!還不如將要查詢的變量值用串口發送出來方便。
、。。。。。

使用特权

评论回复
14
computer00| | 2008-5-14 17:00 | 只看该作者

typedef一个结构体

然后拿这个结构体去定义一个结构体指针。应该可以看到的啊。

使用特权

评论回复
15
meng730507| | 2008-5-14 17:03 | 只看该作者

XDATA窗口中,可以看到的

其实可以直接看到外部变量的值,这个功能确实不常用。

使用特权

评论回复
16
endlessss|  楼主 | 2008-5-14 21:11 | 只看该作者

感谢电脑圈圈,真想请你撮一顿。。。。。。

按照电脑圈圈的方法,现在已经OK。
具体做法为首先定义
.H文件中
typedef struct 
{

}MEM;
extern MEM *Ram;
.c文件中
MEM *Ram;
最后在MAIN函数开始的地方
main()
{
Ram = 0x10000;(此为外部RAM地址)
.....

}

如此方法,不仅变量定义在外部的RAM,而且在KEIL的WATCH WINDOW里面可以方便的监控变量数值。

在此对电脑圈圈和农民讲习所表示深深的谢意。

对此我有想过由于我之前的写法
#define    DaFlash (( struct DATAFLASHRAM  far*) 0x010000)
其中DaFlash并非指针,而是一个常数地址0x010000,所以如此在KEIL中WATCH中敲入DaFlash->VAR .keil 根本就不认识。
按照电脑圈圈的方法定义的就是实实在在的指针。因此KEIL可以识别。
以上为我自己理解。如有不对还请指教。
谢谢

使用特权

评论回复
17
computer00| | 2008-5-14 21:49 | 只看该作者

哈哈~~~不要光想不做~~~~

使用特权

评论回复
18
endlessss|  楼主 | 2008-5-15 16:21 | 只看该作者

什么时候来苏州,一定请你。

嘿嘿!!!

使用特权

评论回复
19
wintonson| | 2010-9-19 19:54 | 只看该作者
我刚看到这篇**
自己用的芯片是stm32 用的编译器是mdk4.03
采用圈圈的方法是不行的
采用下面的方法可行!希望对大伙有借鉴
其实原理是一样的。
typedef struct
{
u32 a;
u32 b;
u32 c;
u32 d;
}Slave_Typedef;
extern  Slave_Typedef *test_struct_p;
在main.c


Slave_Typedef *test_struct_p;、
fsmc初始化后加入
test_struct_p =  (Slave_Typedef*)(0x68000000 + 99);
效果是不错的!

使用特权

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

本版积分规则

12

主题

62

帖子

0

粉丝