打印

定义超过256字节的数组

[复制链接]
658|24
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
houcs|  楼主 | 2022-1-3 21:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
TI, TE, IO, AN, se
在网上找到了如下说明:
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编译器

使用特权

评论回复
沙发
huangchui| | 2022-1-3 21:17 | 只看该作者
还有什么现象?能再详细描述下吗?

使用特权

评论回复
板凳
houcs|  楼主 | 2022-1-3 21:20 | 只看该作者
我没在XC8编译器安装目录下找到上述中的lkr文件

使用特权

评论回复
地板
houcs|  楼主 | 2022-1-3 21:21 | 只看该作者
请问该如何申请大的数组,大概有1024个字节;

使用特权

评论回复
5
chuxh| | 2022-1-3 21:27 | 只看该作者
因为PIC的RAM是分BANK的

使用特权

评论回复
6
houcs|  楼主 | 2022-1-3 21:29 | 只看该作者
什么意思?不是很明白你说的什么

使用特权

评论回复
7
chenjunt| | 2022-1-3 21:32 | 只看该作者
不知道你选什么型号了,xc8手册才是你的终极助手。
以下原文复制
http://ww1.microchip.com/downloads/en/DeviceDoc/50002737C%20XC8%20C%20Compiler%20UG%20for%20PIC.pdf
Objects in data memory are broadly grouped into autos and non-autos and the size limitations of these objects (see 5.4.2.1.2 Object Size Limits and 5.4.2.2.1 Object Size Limits).
更多操作

使用特权

评论回复
8
renyaq| | 2022-1-3 21:35 | 只看该作者
你可以看所选型号的datasheet的存储器章节, 看看有没有整个bank都是作为通用RAM的情况

使用特权

评论回复
9
shimx| | 2022-1-3 21:36 | 只看该作者
正是因为如此, 建议你改善一下算法, 把大数组拆成几个小数组进行操作...

使用特权

评论回复
10
huangchui| | 2022-1-3 21:39 | 只看该作者
即使你找到方法让编译器帮你分配超过256字节的数组, 它只不过做的是把多个小数组拼接成一个大的而已.

使用特权

评论回复
11
jlyuan| | 2022-1-3 21:41 | 只看该作者
本质上, 是由RAM 硬件架构决定的..所以....

使用特权

评论回复
12
houcs|  楼主 | 2022-1-3 21:43 | 只看该作者
主要是调用了一个软件库,不想大动干戈

使用特权

评论回复
13
xxrs| | 2022-1-3 21:44 | 只看该作者
不同软件的架构不一样的, 你要移植过来的话, 不可能说那么的无缝.

使用特权

评论回复
14
zhenykun| | 2022-1-3 21:50 | 只看该作者
或者, 你可以写个函数来处理这个大数组, 让函数, 看起来像数组一样....

使用特权

评论回复
15
xxrs| | 2022-1-3 21:52 | 只看该作者
楼主具体是使用哪颗芯片?不同系列的芯片,情况不一样的。

使用特权

评论回复
16
chuxh| | 2022-1-3 21:55 | 只看该作者
PIC16系列数组大小设定会跟RAM BANK SIZE有关。

使用特权

评论回复
17
dingy| | 2022-1-3 21:57 | 只看该作者
PIC18系列数组大小没有这个要求,只受限于可用的RAM大小。

使用特权

评论回复
18
houcs|  楼主 | 2022-1-3 21:59 | 只看该作者
数组放在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 不错滴

使用特权

评论回复
19
tian111| | 2022-1-3 22:01 | 只看该作者
若是PIC16F1 系列的芯片,楼主定义数组时,把数组定义到线性数据区应该就可以了

使用特权

评论回复
20
lizye| | 2022-1-3 22:03 | 只看该作者
volatile uint8_t tt[512] __at(0x2000);

使用特权

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

本版积分规则

743

主题

8382

帖子

5

粉丝