首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XC16将数据表放入PSV内存(PIC)

XC16将数据表放入PSV内存(PIC)
EN

Stack Overflow用户
提问于 2021-02-20 02:26:31
回答 1查看 148关注 0票数 0

我想在Flash中放一个表,然后直接从我的C程序中读取它。根据microchip的说法,这是由__attribute__((space(psv)))完成的,然而,由于Microchip周围的大多数事情,他们自己的例子工作得不是很好(通常是过时的,没有更新):https://microchipdeveloper.com/16bit:psv

所以这就是我想要做的:

代码语言:javascript
复制
uint16_t __attribute__((space(psv))) ConfDiskImage[] = {
    /*AOUT*/ 0x01E0,0x0004,0x3333,0x4053,
    /*   1*/ 0x01E1,0x0012,0x0005,0x0000,0x0000,0x0000,0x4120,0x0000,0x0000,0x0000,0x4120,
    /*   2*/ 0x01E2,0x0012,0x0006,0x0000,0x0000,0x0000,0x4120,0x0000,0x0000,0x0000,0x4120,
    /*   3*/ 0x01E3,0x0012,0x0007,0x0000,0x0000,0x0000,0x4120,0x0000,0x0000,0x0000,0x4120,
    /*EOD */ 0x0000,0x0000
};

当我编译时,我得到:"warning: ignoring space attribute applied to automatic ConfDiskImage"

我使用的是MPLAB 5.45和XC16--gcc v1.50。单片机: dsPIC33EP256MC506

有没有办法让它留在闪存中(而不是复制到RAM中),并用指针直接从闪存中读取?

EN

回答 1

Stack Overflow用户

发布于 2021-02-20 16:38:27

我怀疑您真正需要的可能是更复杂的东西,但是对于您提出的问题,简单的答案是使用const存储类。

例如:

代码语言:javascript
复制
/*
 * File:   main.c
 * Author: dan1138
 * Target: dsPIC33EP256MC506
 * Compiler: XC16 v1.61
 * IDE: MPLABX v5.45
 *
 * Created on February 19, 2021, 11:56 PM
 */

#pragma config ICS = PGD2, JTAGEN = OFF, ALTI2C1 = OFF, ALTI2C2 = OFF, WDTWIN = WIN25
#pragma config WDTPOST = PS32768, WDTPRE = PR128, PLLKEN = ON, WINDIS = OFF
#pragma config FWDTEN = OFF, POSCMD = NONE, OSCIOFNC = ON, IOL1WAY = OFF, FCKSM = CSECMD
#pragma config FNOSC = FRCDIVN, PWMLOCK = OFF, IESO = ON, GWRP = OFF, GCP = OFF

#include "xc.h"

const uint16_t ConfDiskImage[] = {
    /*AOUT*/ 0x01E0,0x0004,0x3333,0x4053,
    /*   1*/ 0x01E1,0x0012,0x0005,0x0000,0x0000,0x0000,0x4120,0x0000,0x0000,0x0000,0x4120,
    /*   2*/ 0x01E2,0x0012,0x0006,0x0000,0x0000,0x0000,0x4120,0x0000,0x0000,0x0000,0x4120,
    /*   3*/ 0x01E3,0x0012,0x0007,0x0000,0x0000,0x0000,0x4120,0x0000,0x0000,0x0000,0x4120,
    /*EOD */ 0x0000,0x0000
};

int main(void) 
{
    const uint16_t *pData;
    
    pData = ConfDiskImage; /* point to the start of the image */
    /*
     * Walk the image
     */
    for(;;)
    {
        if((!*pData) && (!*pData+1))
        {
            /* At end of image point to the start */
            pData = ConfDiskImage;
        }
        pData++; /* skip record type */
        pData += 1+*pData/2;
    }
    return 0;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66283085

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档