DSP5402之另类的"数组"访问

[复制链接]
4734|21
 楼主| hotpower 发表于 2008-5-16 20:42 | 显示全部楼层 |阅读模式
#define FLASH(x)  (*((volatile unsigned char *) 0x8000 + x))
/*----------------------------------------------------------
另类的"数组"访问,外扩的SST39VF800A从0x8000开始
void FlashObj::ChipErase(void)
{
  FLASH(0x5555) = 0xaa;  
  FLASH(0x2AAA) = 0x55;  
  FLASH(0x5555) = 0x80;
  FLASH(0x5555) = 0xaa;  
  FLASH(0x2AAA) = 0x55;  
  FLASH(0x5555) = 0x10;
  Wait(0x5555);
}
void FlashObj::Wait(unsigned int address)
{
unsigned int temp, val;
  do {
    val = FLASH(address);
    __nop();
    temp = FLASH(address);
    __nop();
  }
  while(((val ^ temp) & (1 << BIT6)) != 0);
}
----------------------------------------------------------*/
 楼主| hotpower 发表于 2008-5-16 21:24 | 显示全部楼层

哈哈~~~准备在DSP上放弃不雅裸奔~~~




walnutcy 发表于 2008-5-16 21:39 | 显示全部楼层

老HOT要穿衣服了,呵呵,

 楼主| hotpower 发表于 2008-5-16 21:43 | 显示全部楼层

哈哈~~~就害怕是"皇帝的新衣"~~~

 楼主| hotpower 发表于 2008-5-18 07:30 | 显示全部楼层

非常感谢simon21ic对宏bug的纠错!!!

simon21ic 发表于 2008-5-17 22:21 侃单片机 ←返回版面   举报该贴 

所以讨论一个没人用的写法没意义啊

映像中途只有看到过一次&a的用法
#define sizeof(a)  ((char*)(&(a)+1) - (char*)&(a))

顺便提一下32楼的宏:
#define FLASH(x)  (*((volatile unsigned char *) 0x8000 + x))
最好写成
#define FLASH(x)  (*((volatile unsigned char *) 0x8000 + (x)))
 
 

相关链接:https://bbs.21ic.com/club/bbs/ShowAnnounce.asp?v=&ID=2967209
ATmega32L 发表于 2008-5-18 07:48 | 显示全部楼层

不如用类似KEIL的方法:

不如用类似KEIL的方法:

#define FLASH  ((volatile unsigned char *) 0x8000)

  FLASH[0x5555] = 0xaa;  
  FLASH[0x2AAA] = 0x55;  
 楼主| hotpower 发表于 2008-5-18 08:02 | 显示全部楼层

哈哈~~~ATmega32L看看ccs听你的有多悲惨~~~

//#define FLASH(x)  (*((volatile unsigned char *) 0x8000 + (x)))
#define FLASH  ((volatile unsigned char *) 0x8000)

编译后:
"flash.cpp", line 109: error: expression must have (pointer-to-) function type

Build Complete,
  36 Errors, 0 Warnings, 0 Remarks.

何况俺想每个数组都自动偏移0x8000,所以宏必须带参数

而参数在()内,要想和数组的[],就必须修改cmd文件.

可dsp/bios不允许~~~


相关链接:https://bbs.21ic.com/club/bbs/list.asp?boardid=10&t=2951291
ATmega32L 发表于 2008-5-18 08:46 | 显示全部楼层

按理说不应该抱错啊

没用过CCS。

#define FLASH  ((volatile unsigned char *) 0x8000)
这应该是符合标准C的写法,按理说不应该抱错啊。
FLASH[0XAA]相当于 ((volatile unsigned char *) 0x8000)[0xaa]
语法上没错啊。
HWM 发表于 2008-5-18 08:54 | 显示全部楼层

一个是(),一个是[],南辕北辙。

 楼主| hotpower 发表于 2008-5-18 20:43 | 显示全部楼层

很是不困难接收[]符号的~~~它是数组的专利~~~

再LS:

()实际为指针,而[]为数组.
在很多编译器编译时结果是一样的.
 楼主| hotpower 发表于 2011-11-4 10:28 | 显示全部楼层
最近被逼迫再次搞DSP
kethon 发表于 2011-11-4 11:30 | 显示全部楼层
严重挖坟啊:lol
keken 发表于 2011-11-4 12:57 | 显示全部楼层
时间好早啊
keken 发表于 2011-11-4 12:57 | 显示全部楼层
晕死我了
 楼主| hotpower 发表于 2011-11-5 00:03 | 显示全部楼层
严重挖坟啊:lol
kethon 发表于 2011-11-4 11:30


哈哈,菜农俺三天把古老的F206的汇编学习完毕,而且每行全部注解~~~
Cortex-M0 发表于 2011-11-5 07:13 | 显示全部楼层
菜农精力旺盛,像个二十岁的小伙子,佩服~~~
keken 发表于 2011-11-5 13:36 | 显示全部楼层
看看老帖 也蛮不错的呢
keken 发表于 2011-11-5 13:36 | 显示全部楼层
收获很大
 楼主| hotpower 发表于 2011-11-5 16:58 | 显示全部楼层
DSP的指令集还是非常强大的。
tianyu01 发表于 2011-11-5 22:14 | 显示全部楼层
DSP依然是那么的强大啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1460

主题

21617

帖子

508

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