打印
[国产单片机]

松翰单片机C开发环境一个困扰的问题

[复制链接]
8355|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
stealth|  楼主 | 2012-5-25 19:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我在用C写一个在松翰单片机上跑的程序.里面要写FLASH.松翰里面写FLASH很麻烦啊,要把我要写的内容的开始地址和长度设置到专用的寄存器里(不能直接某地址写某数).但编译总有警告:
conversion from `pointer to __RAM unsigned char' to `unsigned char' is compiler dependent
non_ANSI_rules : conversion from `pointer to __RAM unsigned char' to `unsigned char' is undefined
我是这样写的:
unsigned char ADD[6];
ADD数组里面是要保存进FLASH的数据,PERAML是寄存器,用来指定我要写的RAM的开始地址的.
PERAML = (unsigned char )ADD;
就是不让我把一个地址存进一个变量.怎么才能把一个变量的地址存进另一个变量啊!我试过一样的程序在keil C里面都无问题的.松翰把单片机设计
成写flash非要往寄存器里存变量的地址,但C编译器又不让你这样写,快被它气死了.

此外,我觉的编译器有问题.我想反过来把FLASH里面的值读到变量里,别的C环境都是很简单的,但这里必出问题.语法是没问题通过的,但必然会生成
一个_indir_rom2,不知道是什么东西,然后提示这个东西在我这段读FLASH内容的子函数里及中断程序里多重调用了.狂晕!然而要不这样读FLASH,
就根本无这东西生成,也就没有多重调用的错误(很恶心的是,一旦它认为你有多重调用,就一定是error不让你过而不是警告,很多时候我们写软件的自己
知道自己程序的结构实际上不会产生问题的嘛),害的有时候要实现同一个功能要写两个名字不一样的子函数,一个在中断里用.外面用另一个才能编译
通过!太变态的编译器了.

相关帖子

沙发
l4157| | 2012-5-26 07:05 | 只看该作者
估计是你理解错了:PERAML = (unsigned char )ADD;
松翰的那款芯片不明,但是语法肯定不正确,至少要加个取址吧?

使用特权

评论回复
板凳
l4157| | 2012-5-26 07:06 | 只看该作者
一个方法,把ADD定位到一个固定地址,然后PERAML 写入固定的地址值

使用特权

评论回复
地板
stealth|  楼主 | 2012-5-26 09:57 | 只看该作者
ADD就是地址,因为ADD是个数组。要是先软仿真看分配了什么地址然后再用固定的数值可以,但我觉的这样做不是正路啊!Sonix没理由弄出这样一个低级错误来的吧?

使用特权

评论回复
5
l4157| | 2012-5-26 13:59 | 只看该作者
编程时要用绝对地址定位ADD,这样以后修改就不会每次自己编译后自己定位,我不是很了解松翰的C,但希望这样解释可以帮到你。
比如定义 ADD[] @绝对定地址;
PERAML =  绝对地地址。

使用特权

评论回复
6
stealth|  楼主 | 2012-5-26 20:10 | 只看该作者
如果我用绝对的地址制定分配给变量,编译器能智能的避开我分配的地址吗?我怕编译器不够智能。不过可以试一试。

使用特权

评论回复
7
stealth|  楼主 | 2012-5-27 09:32 | 只看该作者
但是松翰的C不知道怎么才能指定地址分配给变量啊!用指针的编译器能通过但分配的时候不认为是个变量,会被别的变量覆盖掉那部分地址区间。

使用特权

评论回复
8
l4157| | 2012-5-27 21:38 | 只看该作者
一般C都支持绝对地址定位的,你还是找个文档查一下吧!你还没有说你的环境:IC类型,C版本,所以我也不能查找,C编译器是可以智能的避开你分配的地址的,请放心,但是地址申请时注意芯片资源和C编译器要求,避开C语言的缓冲区

使用特权

评论回复
9
McuPlayer| | 2012-5-28 12:49 | 只看该作者
找Sonix的帮助文档看一下,里面有详细的说明

使用特权

评论回复
10
stealth|  楼主 | 2012-5-28 14:04 | 只看该作者
没找到这方面的说明,现在可以100%肯定是C编译器的问题,有不少标准C应该支持的都不支持。同样的程序放到keil,IAR或是comsic的C环境去试,什么问题也没有,松函上面死活就通不过。看来用C来开发,大一些的程序还不能选国产的单片机。

使用特权

评论回复
11
l4157| | 2012-5-31 12:58 | 只看该作者
肯定能定位绝对,否则那些寄存器怎么定义?找个头文件研究一下,依葫芦画瓢。肯定能解决你的问题。

使用特权

评论回复
12
stealth|  楼主 | 2012-6-7 17:55 | 只看该作者
能绝对定位但没用啊,内存变量不能制定地址的分配就没用.

使用特权

评论回复
13
a588888| | 2012-6-9 21:10 | 只看该作者
一般C都支持绝对地址定位的,你还是找个文档查一下吧!你还没有说你的环境:IC类型,C版本,所以我也不能查找,C编译器是可以智能的避开你分配的地址的,请放心,但是地址申请时注意芯片资源和C编译器要求,避开C语言的缓冲区

使用特权

评论回复
14
李冬发| | 2012-6-11 05:21 | 只看该作者
那你试试
&ADD[0]

很多编译器必须这样显式求地址。

使用特权

评论回复
15
stealth|  楼主 | 2012-6-13 15:57 | 只看该作者
是S8N2271B,松翰的C编译环境,它里面要写flash,必须往一个特定的积存器送入地址.
PERAML = 0x43; -- 这样是可以的,但这需要先看map文件看变量分配到了哪里,这就是实际的地址.
假设要写的变量是ADD:  PERAML = &ADD; -- 这样是通不过编译的.keil和IAR里面这样写是可以的.
它的C里面我没找到有可以指定地址分配变量的伪指令.
可以用指针指到某的地址,但编译器编译的时候不会考虑你这样指定的地址的.:L

使用特权

评论回复
16
l4157| | 2012-6-14 11:06 | 只看该作者
#define X (*((__RAM unsigned int*)0x85))
#define PFLAG (*((__RAM unsigned int*)0x86))
粗略的查了一下,可以这样定义寄存器,
所以有个方法:
#define TEST (*((__RAM unsigned int*)0x0))
PERAML = (&ADD-&TEST);

使用特权

评论回复
17
stealth|  楼主 | 2012-6-14 11:22 | 只看该作者
#define X (*((__RAM unsigned int*)0x85))
#define PFLAG (*((__RAM unsigned int*)0x86))
粗略的查了一下,可以这样定义寄存器,
所以有个方法:
#define TEST (*((__RAM unsigned int*)0x0))
PERAML = (&ADD-&TE ...
l4157 发表于 2012-6-14 11:06

我试了一下不行,通不过编译的.现在的问题是这个垃圾编译器把PERAML这寄存器认定是
一个变量,只能赋数值.你要给它赋的是地址,不论你怎么写都不行.

使用特权

评论回复
18
faithai| | 2013-10-14 17:32 | 只看该作者
stealth 发表于 2012-6-14 11:22
我试了一下不行,通不过编译的.现在的问题是这个垃圾编译器把PERAML这寄存器认定是
一个变量,只能赋数值.你 ...

编译是可以通过的 注意RAM左边是双下杠__  2个_

使用特权

评论回复
19
zhaofei154| | 2013-10-14 23:46 | 只看该作者
学习中。。。。。。。。

使用特权

评论回复
20
旭日东起| | 2013-10-17 16:48 | 只看该作者
台湾这些出厂的MCU,最好用汇编来写吧,C编译是不成熟的

使用特权

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

本版积分规则

16

主题

87

帖子

1

粉丝