历史上的今天
返回首页

历史上的今天

今天是:2025年02月13日(星期四)

正在发生

2020年02月13日 | PIC单片机数据存储的问题

2020-02-13 来源:eefocus

遇到的问题:定义了一个无符号整形的数组,数组中某个元素的低字节在0X01FF,高字节在0X0200,因此出现了错误;


解决的方案:重新把定义的变量的顺序规范了一下,高效利用了数据存储空间,同时也该数组的地址也变了,其他变量也都没有跨页存储的现象,问题解决;


备用的方案:利用#pragam关键字,自己定义变量的存储地址,可以有效避免此类情况发生,更为灵活。但是要比较了解该款单片机的存储空间的结构,否则容易出错。


以下为网上整理资料:


idata表示已经初始化的数据。udata表示没有初始化的数据。


当一个数据块没有足够的空间用于存放一个连续的数据时(数组);此时便可用#pragma idata 或#pragma udata来定义一个新的存放数据块的区域。但是#pragma idata 或#pragma udata申请的空间也还是有限的,一般不能大于256,如果超过则只能另外想法办了。


为什么不能大于256?


可以看相关的IC链接文件.lkr,从它里面可以看到它是如何定义bank大小的,没有一个是大于0xff的,因为PIC18的命令是双字节的即只有16位,但是在一个操作RAM的命令中只有8位数据来表示RAM地址,其它的为操作码或者其它。故它最大的寻址范围只能256,如果大于256只能借助其它寄存器BSR来扩展地址。这也是BANK的由来。另外由于数组存放的空间应该放在一个连续的空间里,故不能大于256,因为大于256,命令是无法自动跨BANK寻址的,如果要跨BANK则只能事先设定好BANK区。


如何查看我们定义的变量存放在哪里?可以查看生成的.map文件。


map文件的生成设置:project–>build options–>project—>MPLINK mplinker,选择Generate map file.


它们的用法:


#pragma idata DataArray //一个数据块的开始




char DataArray[256]={0};


#pragma idata //一个数据块的结束


#pragma udata DataArray1 //一个数据块的开始




char DataArray1[256];


#pragma udata //一个数据块的结束


在PIC中的const关键字,及rom关键字,#pragma rom


在MCC18编译器中。


const char array[300]={0};


这样定义了一个超过bank最大值的变量,在编译时会产生错误.为什么?


const虽然指明了将变量array存储在了rom区,但是在MC18编译器中却因为变量的指向是RAM区,所以它默认的情况下还是将数据存储在了RAM区。即const单独无法实现将数据存放在ROM区的作用。而在MC18编译器说明中,如果要将数据放在ROM区,则要加上rom关键字。即如下定义


rom char array[300]={0};


const rom char array[300]={0};这样才不会出错。


或者采用如下方式:


#pragma rom udatasection




const rom char array[300]={0};


#pragma rom


code:用于存放指令代码


rom:用于存储数据常量的.在map中的段名叫romdata.


1、#pragma code 定位程序代码在程序存储器中的位置


2、#pragma romdata 定位数据在程序存储器中的位置


3、#pragma udata 定位未初始化的用户变量在数据存储器中的位置


4、#pragma idata 定位初始化的用户变量在数据存储器中的位置


格式:#pragma code(短名称)(=地址)


#pragma code _entry_scn=0×18


推荐阅读

史海拾趣

Ericsson Power Modules公司的发展小趣事

在创立初期,Ericsson Power Modules就展现出了强大的技术创新能力。公司团队通过深入研究电源技术、电路板应用和系统知识,成功开发出了一系列高性能、高效率的电源模块产品。其中,DC-DC转换器、中级和先进总线转换器、POL稳压器等产品因其卓越的性能和稳定性,在市场上赢得了广泛好评。这些技术突破和产品创新为Ericsson Power Modules的后续发展奠定了坚实的基础。

Bivar公司的发展小趣事

随着技术的不断发展和市场的日益扩大,Bivar公司意识到国内市场的局限性,开始积极拓展国际市场。公司派遣专业团队前往海外进行市场调研,了解当地需求和竞争态势。通过定制化的产品和灵活的销售策略,Bivar成功打入多个海外市场,并获得了可观的收益。

广东华裕(GDHY)公司的发展小趣事

随着环保意识的日益增强,电子行业对绿色环保的要求也越来越高。Bivar公司积极响应这一趋势,投入大量资源进行环保技术的研发和应用。公司推出了一系列绿色环保的电子产品,如低能耗、无毒害的电阻器和电容器等。这些产品不仅符合了市场需求,还为公司树立了良好的环保形象。

BELLING LEE公司的发展小趣事

随着电子市场的不断发展和消费者需求的多样化,BELLING LEE公司意识到单一的产品线已无法满足市场需求。于是,公司开始积极拓展产品线,推出了包括智能手机、平板电脑、智能家居设备等一系列新产品。这些新产品不仅满足了消费者的多样化需求,也进一步巩固了公司在电子市场的领先地位。

Exar [Exar Corporation]公司的发展小趣事

Exar始终注重通过收购和合并来增强自身的技术实力和市场竞争力。例如,2012年Exar收购了Integrated Memory Logic Limited(iML),这一举措加强了其在存储和数据管理领域的地位。通过收购iML,Exar获得了更多的技术资源和市场份额,为其后续的发展提供了有力支持。

Azoteq公司的发展小趣事

随着触控技术的兴起,Azoteq在2004年增加了第二条产品线,以应对新兴的电容式触摸和接近感应产品市场。这一举措使得Azoteq能够紧跟市场趋势,为客户提供更多样化的产品选择。通过不断的技术创新和市场拓展,Azoteq在这一领域逐渐取得了领先地位。

问答坊 | AI 解惑

经济型袖珍示波器PCB图

经过对调试样机电路的整理,重新布线的PCB正式版完成了,发上来给大伙评点评点,等板子做好后,将元件参数调整好,再将电路图发给大家评点。当然还有以前提到的能在PC上仿真运行的评估软件,也会在稍后发上来。 如果项目进展顺利,我想把它搞成开 ...…

查看全部问答>

毕业设计:基于单片机的智能防盗报警器

毕业设计:基于单片机的智能防盗报警器 有没人做过类似的项目可以给我参考下啊 我想做个成品出来 有人可以给些资料参考么?…

查看全部问答>

请问有了解at45d041这个芯片的人吗?

我用单片机做一个读写这个芯片的东西,但是对这个芯片不怎么了解。请问一下他有具体的用途是什么呢?不会仅仅是一个存储芯片把?…

查看全部问答>

IIC通信的 应答信号

/****************************************************************************** 函数:I2C_GetAck() 功能:读取从机应答位(应答或非应答),用于判断:从机是否成功接收主机数据 返回:0-从机应答        1-从机非 ...…

查看全部问答>

嵌入式爱好者的学习笔记连载(二)

嵌入式爱好者的学习笔记连载(二)    决定开始学习嵌入式后,最先做的事情就是要熟悉ARM指令及其伪指令伪操作,这个阶段最好有高手教你,或者参加专业机构培训也是种高效方式,选择自学的要有心理准备了,非常非常非常难。ARM指令的助记符 ...…

查看全部问答>

打开串口失败 为什么呢?

VS08下编的win32程序 打开串口 失败为什么呢? 建的是STANDARDSDK MIPSII平台设备的  程序放入设备中,设备串口和电脑PC机相连 运行后,发现程序 打开串口失败? 有哪几种原因呢?驱动方面有问题?是不是驱动方面对串口的配置不 ...…

查看全部问答>

通过何种方式可以轻松实现计算机-继电器(或者PLC)简单的通讯控制

需要实现简单1/0通讯,计算机得到继电器开关信号,同时通过判断返回一个开关信号到继电器。 是否需要串口通讯?和其他更简单办法?请不吝赐教。 …

查看全部问答>

请教各位大神verilog的问题

//一个0~16的counteralways @(posedge clkin or posedge rstin)if (rstin)   cnt <= 0;else if (cnt == 16)   cnt <= 0;else   cnt <= cnt + 1;请问能这么描述么,如果能,为什么if的情况能分为这三类,希望牛 ...…

查看全部问答>

滤波基础知识 转

可能有用 转自网站…

查看全部问答>