打印
[PIC®/AVR®/dsPIC®产品]

如何定义超过256字节的数组

[复制链接]
2024|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
736880733|  楼主 | 2019-2-28 22:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
TE, TI, IO, AN
我的环境:MPLAB X V5.10 编译器 XC8 2.05
在网上找到了如下说明:
1. The object must be allocated into its own section using the #pragma idata or #pragma udata directive.
    #pragma udata buffer_scn
    static char buffer[0x180];
    #pragma udata
2. Accesses to the object must be done via a pointer.
    char * buf_ptr = &buffer[0];
    ...
    // examples of use
    buf_ptr[5] = 10;
    if (buf_ptr[275] > 127)
    ...
3. A new region that spans multiple banks must be created in the linker script.
Linker script before modification:

    DATABANK NAME=gpr2 START=0x200 END=0x2FF
    DATABANK NAME=gpr3 START=0x300 END=0x3FF
Linker script after modification:

    DATABANK NAME=big  START=0x200 END=0x37F PROTECTED
    DATABANK NAME=gpr3 START=0x380 END=0x3FF
4. The object's section (created in Step #1) must be assigned into the new region (created in Step #3). Add a SECTION directive to the linker script.
SECTION NAME=buffer_scn RAM=big
但是这个好像针对的C18编译器,而且我没在XC8编译器安装目录下找到上述中的lkr文件;
请问该如何申请大的数组,大概有1024个字节;
该如何是好!
沙发
二九结狐六体| | 2019-3-1 07:46 | 只看该作者
不错的啊! 哈哈哈

使用特权

评论回复
板凳
736880733|  楼主 | 2019-3-1 08:18 | 只看该作者

大哥,这标题是个疑问句!

使用特权

评论回复
地板
CoolSilicon| | 2019-3-1 08:41 | 只看该作者
因为PIC的RAM是分BANK的, 你可以看所选型号的datasheet的存储器章节, 看看有没有整个bank都是作为通用RAM的情况.
正是因为如此, 建议你改善一下算法, 把大数组拆成几个小数组进行操作...

即使你找到方法让编译器帮你分配超过256字节的数组, 它只不过做的是把多个小数组拼接成一个大的而已.

本质上, 是由RAM 硬件架构决定的..所以....

使用特权

评论回复
5
736880733|  楼主 | 2019-3-1 09:01 | 只看该作者
CoolSilicon 发表于 2019-3-1 08:41
因为PIC的RAM是分BANK的, 你可以看所选型号的datasheet的存储器章节, 看看有没有整个bank都是作为通用RAM的 ...

主要是调用了一个软件库,不想大动干戈

使用特权

评论回复
6
CoolSilicon| | 2019-3-1 10:01 | 只看该作者
736880733 发表于 2019-3-1 09:01
主要是调用了一个软件库,不想大动干戈

不同软件的架构不一样的, 你要移植过来的话, 不可能说那么的无缝.
或者, 你可以写个函数来处理这个大数组, 让函数, 看起来像数组一样....

使用特权

评论回复
7
oxygenzz| | 2019-3-1 11:18 | 只看该作者
本帖最后由 oxygenzz 于 2019-3-1 11:51 编辑

楼主具体是使用哪颗芯片?不同系列的芯片,情况不一样的。
PIC16系列数组大小设定会跟RAM BANK SIZE有关。
PIC18系列数组大小没有这个要求,只受限于可用的RAM大小。



使用特权

评论回复
8
lcczg| | 2019-3-1 11:42 | 只看该作者
数组放在Flash中和Ram中也是不同的。看下MPLAB IDE help中的help contents->contents->XC8 toolchain->MPLAB XC8 c compiler for PIC MUCs->How To's ->Understanding the complication process->How big can C variables be?     How to's 不错滴

使用特权

评论回复
9
oxygenzz| | 2019-3-1 12:16 | 只看该作者
本帖最后由 oxygenzz 于 2019-3-1 12:18 编辑

若是PIC16F1 系列的芯片,楼主定义数组时,把数组定义到线性数据区应该就可以了

volatile uint8_t tt[512] __at(0x2000);

一般线性区地址是从0x2000开始。这一信息应该在芯片的数据手册LINIEAR DATA MEMORY 一章能找到。

使用特权

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

本版积分规则

8

主题

25

帖子

0

粉丝