智能终端定制开发 ad
MTK/瑞芯微/高通-Android,智能模块/智能终端方案商

深度定制各类智能终端和智能硬件产品,提供硬件选型咨询、参考设计、元器件推荐、驱动开发、行业模块集成、操作系统定制与算法集成等软硬件定制服务。
contact.aspx

Android核心板产品覆盖2G、3G、4G通讯,双核、四核、八核CPU,可选的平台有MTK6580、MTK6737、MTK6750等,Android版本有5.1 6.0 7.0等。
contact.aspx

可广泛应用于低端智能POS、安防监控、车载设备、低端智能机器人、智能家居、智能硬件、工业智能手持设备、低端智能对讲设备、低端警务或执法设备、智能穿戴、贩卖机、物流柜、智能门禁系统等行业和设备。
contact.aspx

可提供以太网转串口透传,WIFI转串口透传,蓝牙转串口透传,CAN总线模拟量控制输出模块等。
contact.aspx

带3G或4G通讯功能,运行android系统,有多个串口,可以外挂各种模块:条码扫描、RFID、指纹识别、身份证识别、磁条卡、ID卡、GPS/北斗模块等。
contact.aspx

具有4G通讯功能,多个RS232或RS485接口,以太网接口,USB接口,CAN接口,多个AD输入。基于Android系统智能平台,方便APP应用开发。器件严格选型,运行稳定,质量可靠。
contact.aspx

MCC18 FAQ4 如何在数据存储器中创建一个大对象(> 256 字节)?
[电子技术] 2008-06-26
 
默认情况下, MPLAB C18 假设对象不超过存储区边界。要安全使用大于256 字节的
对象,需要执行下列步骤:
1. 必须使用#pragma idata 或#pragma udata 伪指令将对象分配到恰当的段
中:
#pragma udata buffer_scn
static char buffer[0x180];
#pragma udata
2. 必须通过指针访问对象:
char * buf_ptr = &buffer[0];
...
// examples of use
buf_ptr[5] = 10;
if (buf_ptr[275] > 127)
...
3. 必须在链接描述文件中创建一个跨越多个存储区的区域:
- 修改前的链接描述文件:
DATABANK NAME=gpr2 START=0x200 END=0x2FF
DATABANK NAME=gpr3 START=0x300 END=0x3FF
- 修改后的链接描述文件:
DATABANK NAME=big START=0x200 END=0x37F PROTECTED
DATABANK NAME=gpr3 START=0x380 END=0x3FF
4. 必须通过在链接描述文件中添加SECTION 伪指令,将对象所在的段(在第1 步
中创建)分配到新的区域(在第3 步中创建):
SECTION NAME=buffer_scn RAM=big
 

太好啦

刚好遇到这个问题。
我用了好笨的方法才把数据拆开的。
 

如何改???

我用的PIC18F452,下面是18F452.lkr
我应如可改啊?
请版主帮一忙,做一示例!谢谢(3-4步不明白)
// $Id: 18f452.lkr,v 1.1 2003/12/16 14:53:08 GrosbaJ Exp $
// File: 18f452.lkr
// Sample linker script for the PIC18F452 processor

LIBPATH .

FILES c018i.o
FILES clib.lib
FILES p18f452.lib

CODEPAGE   NAME=vectors    START=0x0            END=0x29           PROTECTED
CODEPAGE   NAME=page       START=0x2A           END=0x7FFF
CODEPAGE   NAME=idlocs     START=0x200000       END=0x200007       PROTECTED
CODEPAGE   NAME=config     START=0x300000       END=0x30000D       PROTECTED
CODEPAGE   NAME=devid      START=0x3FFFFE       END=0x3FFFFF       PROTECTED
CODEPAGE   NAME=eedata     START=0xF00000       END=0xF000FF       PROTECTED

ACCESSBANK NAME=accessram  START=0x0            END=0x7F
DATABANK   NAME=gpr0       START=0x80           END=0xFF
DATABANK   NAME=gpr1       START=0x100          END=0x1FF
DATABANK   NAME=gpr2       START=0x200          END=0x2FF
DATABANK   NAME=gpr3       START=0x300          END=0x3FF
DATABANK   NAME=gpr4       START=0x400          END=0x4FF
DATABANK   NAME=gpr5       START=0x500          END=0x5FF
ACCESSBANK NAME=accesssfr  START=0xF80          END=0xFFF          PROTECTED

SECTION    NAME=CONFIG     ROM=config

STACK SIZE=0x100 RAM=gpr5
 
 
 
这个其实示例已经说得很清楚了。例如按照FAQ4中的步骤可做如下修改:

ACCESSBANK NAME=accessram  START=0x0            END=0x7F
DATABANK   NAME=gpr0       START=0x80           END=0xFF
DATABANK   NAME=gpr1       START=0x100          END=0x1FF

//DATABANK   NAME=gpr2       START=0x200          END=0x2FF          // 第三步
//DATABANK   NAME=gpr3       START=0x300          END=0x3FF
DATABANK     NAME=big          START=0x200          END=0x37F           PROTECTED
DATABANK     NAME=gpr3        START=0x380          END=0x3FF

DATABANK   NAME=gpr4       START=0x400          END=0x4FF
DATABANK   NAME=gpr5       START=0x500          END=0x5FF
ACCESSBANK NAME=accesssfr  START=0xF80          END=0xFFF          PROTECTED

SECTION    NAME=CONFIG     ROM=config

SECTION     NAME=buffer_scn   RAM=big         //第四步

STACK SIZE=0x100 RAM=gpr5

仅供参考。
 
 
但是有一个问题,修改完之后会提示保存不保存,如果保存了,MCC18中的原先那个.LKR文件就改变了,以前的程序会不会有影响,以后再做项目是不是都要按照修改后的LKR文件来定义RAM的分区.
 
 
不要修改MCC18 原来的.lkr文件。可拷贝一个.lkr到特定的项目文件夹里,修改拷贝的.lkr文件,然后将该修改的.lkr文件添加到项目中。
 
变量引用可以通过指针,那结构体和公用体的位操作又怎么办,  我的项目里,光这样的结构体就会超过255个,必须跨BANK定义,指针能操作的了吗?
 
差不多的。比如:
复制内容到剪贴板
代码:

typedef struct tag_data
{
  int a;
  int b;
  int c;
  } DATA;
#pragma udata big_data
DATA data[50];               
#pragma udata
void main (void)
{
    unsigned int i;
    DATA * data_ptr;
    data_ptr = &data[0];
    for ( i = 0; i < 20; i ++)
{
    data[i].a = 0x5555;
    data[i].b = 0x6666;
    data[i].c = 0x8888;
    data_ptr[i].c = 0x9999;
}
data_ptr[30].a = 0xaaaa;
data_ptr[30] -> b = 0x9999;
while(1);
}
之所以强调用指针引用(包括显示引用和“隐式引用”--姑且这样称之,如上面“data”)是告诉编译器用间址寻址(indirect addressing,即用FSR0)引用大数据对象而不用考虑跨区(bank)引用时BSR 的值。
可能是目前版本的C18 不够聪明,有时跨区访问时不知道及时更新BSR。这样用直接寻址时就会访问了错误的地址单元。另外,有时如果编译时已知道大数据对象的地址,编译器会生成更为简洁的汇编代码,如直接用MOVFF等。

[ 本帖最后由 Victor 于 2008-4-2 12:55 编辑 ]
[电子技术添加评论 | 评论/阅读(0/553)
评论
昵称
主页
内容
递交


Copyright @ 我的开发笔记     2008 - 2017         粤ICP备19155526号-1