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. Spring Boot 打包不同环境配置与 Shell 脚本部署
  2. easyswoole数据库连接池_easyswoole redis连接池:集群迁移教程
  3. Java ArrayList和Vector、LinkedList与ArrayList、数组(Array)和列表集合(ArrayList)的区别...
  4. SPOJ Finding Fractions
  5. linux内核提取ret2usr,Linux内核漏洞利用技术详解 Part 2
  6. 正确使用日志的10个技巧(转)
  7. php打印函数console,PHP内置Web Server探究(2)自定义PHP控制台输出console函数
  8. 我的世界高亮显示服务器,waila(我的世界高亮显示没了)
  9. 电子工艺实训考核装置
  10. mysql创建表代码_MySQL------代码建表
  11. python实现矩阵乘法(不用numpy)
  12. java 服务器文件下载
  13. 阿里的黄金时代|一点财经
  14. 使用POI对excel文件进行读取
  15. 虚拟的超级计算机和云计算,概念PK:云计算与高性能计算(HPC)
  16. 视觉中国财报背后的版权门余波
  17. 生鲜小程序制作价格 平邑网站建设网店制作app开发
  18. Android 音视频开发实践系列-04-Android WebRTC推流到SRS服务器实现直播功能
  19. 显示器接口_电脑显示器接口类型哪个好?VGA、DVI、HDMI、DP接口区别对比科普
  20. 高中生可以学习编程吗?

热门文章

  1. NYOJ 30 Gone Fishing(贪心)
  2. 删除指定路径下的文件
  3. eclipse 模版的使用
  4. 移动设备真机调试本地程序的Node.js【无需连wifi】
  5. js ie 6,7,8 使用不了 firstElementChild
  6. String,StringBuffer,StringBuilder区别
  7. 软件专业人才应具备四种素质
  8. 用Python更改IP地址(转)
  9. MATLAB中的wavedec、wrcoef函数简析
  10. 吴恩达 coursera ML 第一课总结