PIC中的#pragma idata 和#pragma udata:

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
在MC18编译器中。

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.

PIC中的#pragma idata 和#pragma udata相关推荐

  1. #pragma comment和#pragma 预处理指令详解

    该宏放置一个注释到对象文件或者可执行文件. 例如,#pragma   comment(lib,"Ws2_32.lib")表示链接Ws2_32.lib这个库. 和在工程设置里写上链入 ...

  2. #pragma DATA_SECTION与#pragma CODE_SECTION的使用

    (一)#pragma DATA_SECTION 利用CCS进行DSP编程时,如果不指定变量的存储位置,那么编译器会自动给变量分配存储位置,但是,有些时候,需要将某个变量存放到某个特定的位置,这个时候就 ...

  3. #pragma warning( pop ) #pragma warning( push )

    今天在看源码的时候,遇到以下内容: #pragma warning(push)是保存当前的编译器警告状态: #pragma warning(pop)是恢复原先的警告状态. 例如: #ifdef _MS ...

  4. [转]#pragma once和#pragma comment

    编程经常碰到,理解的总不是很透彻,在这里查阅资料总结一下! 在编写程序的时候,我们常用到#pragma指令来设定编译器的状态或者是指示编译器完成一些特定的动作. #pragma once : 这是一个 ...

  5. 预处理指令pragma常见用法集锦(#pragma once、#pragma comment和#pragma warning)

    #pragma once: 这是一个比较常用的指令,只要在头文件的最开始加入这条指令就能够保证头文件被编译一次,避免文件被重复包含. ********************************* ...

  6. c语言 pragma code,关于#pragma CODE_SECTION的用法?

    #pragma CODE_SECTION(adc_isr, "ramfuncs");这样的语句是什么意思呢?是不是需要经常调用的程序都需要作这样的定义? Seven Han: 关于 ...

  7. 关于keil-C51中code、idata以及xdata

    对了,我最近开通了微信公众号,计划是两边会同步更新,并逐步的会将博客上的文章同步至公众号中. 感兴趣的朋友可以扫描下方的二维码或者搜索"里先森sements"来关注,欢迎来玩~! ...

  8. 【IoT】CC254x 中 data、idata、xdata 和 pdata 区别以及堆 Heap 内存布局

    1.data.idata.xdata 和 pdata 区别 从数据存储类型来说,8051 系列有片内.片外程序存储器,片内.片外数据存储器,片内程序存储器还分直接寻址区和间接寻址类型,分别对应code ...

  9. 汇编语言中寻址方式[bx + idata]

    [bx + idata]含义: 用于灵活的表示内存单元,[bx + idata] 的方式为高级语言实现数组提供了遍历机制. 数学化描述 :(ax) = ((da)*16 + (bx) + 200) 物 ...

最新文章

  1. 0459-Repeated Substring Pattern(重复的子字符串)
  2. 研发团队远程高效协作秘笈
  3. E - Olympic Medal CodeForces - 215B(数学 思维)
  4. python网络爬虫系列(一)——urllib库(urlopen、urlretrieve、urlencode、parse-qs、urlparse和urlsplit、request.Request类)
  5. 二叉搜索树中第k大元素_二叉搜索树中第K个最小元素
  6. 谈谈写程序与学英语(转载)
  7. SCOM 2012 R2监控Microsoft Azure服务(2)配置Azure监控
  8. 【渗透测试案例】——Web前端的SQL注入是怎么回事?
  9. swift 第五课 定义model类 和 导航栏隐藏返回标题
  10. MYSQL 远程访问被限制
  11. java B2B2C 源码 多级分销Springcloud多租户电子商城系统-Spring Cloud eureka
  12. 黑马程序员全套Java教程_Java基础入门视频教程零基础自学Java必备教程视频讲义(4)
  13. 牛津英语字典pdf下载_英语词典 | 5本图解词典,让你拥有英语思维,一图胜千言!...
  14. 谷歌chrome浏览器安装json插件
  15. 行业研究方法与框架合集
  16. 小米mix2安兔兔html5跑分,vivo X21跑分多少?高通骁龙660 AIE安兔兔跑分实测
  17. 快速采集交换机下计算机ip,怎样查看整个交换机里的电脑ip
  18. Access时间日期比较查询的方法总结
  19. js控制excel打印完美解决方案
  20. 浅析微信小程序生命周期之应用生命周期

热门文章

  1. NYOJ 108 士兵杀敌(一)
  2. NYOJ 358 取石子(五)
  3. k8s之CRD定义map[string]interface{}类型
  4. [JZOJ4788] 【NOIP2016提高A组模拟9.17】序列
  5. 面试金典--min栈的实现
  6. 键盘各个键对应的ASCLL值
  7. linux下 C编程改变输出字体颜色
  8. [云炬创业管理笔记]第五章打磨最有效的商业模式测试1
  9. ustc小道消息20220120
  10. 科大星云诗社动态20220102