【问题标题】:reading pic18 rom constants with C18用 C18 读取 pic18 rom 常量
【发布时间】:2013-12-02 11:16:23
【问题描述】:

我很难理解为什么我在尝试从存储在 rom 中的多维表中读取数据时得到随机数据。

我有一张想要在 OLED 屏幕上显示的位图字符表。字符表太大而无法放入 ram 中,而 rom 是它的自然位置。当我尝试从表中读取元素时,数据不是存储在表中的数据。

这是我尝试做的。我在使用它的 C 文件的请求中将位图声明为多维数组:

rom const char number[15][4][20] = { {
{0x00, 0x00, 0x00, 0x00, 0xc0, 0xe0, 0xf0, 0x70, 0x78, 0x38, 0x38, 0x38, 0x38, 0x78, 0x70, 0xf0, 0xe0, 0xc0, 0x00, 0x00},// row 1 columns 19
{0x00,...

这是我尝试读取数据并将其打印到屏幕的地方:

for(i=0; i<4; i++)
    {
        PutImage(number[digit][i],20,4,offset,i+2);
    }

PutImage函数的实现:

void PutImage(char ptr[], unsigned char sizex, unsigned char sizey, unsigned char startx, unsigned char starty)
{
unsigned char _page, _column;

//startx += OFFSET;

OledWriteCommand(0xb0+starty);
OledWriteCommand(startx&0x0F);
OledWriteCommand(0x10 | ((startx>>4)&0x0F));

for(_column=0; _column<sizex; _column++)
{
    OledWriteData(ptr[_column]);
}
}

如果我更改它以使数据适合 ram,它就可以正常工作。所以问题要么是数据一开始没有正确存储,要么是我使用它的方式不正确。

我使用的图片是 18F27J53,数据表第 7.1 节(表读取和表写入)讨论了一些用于在程序存储器和 ram 之间移动字节的汇编器操作。当我使用 C 时,我不确定这是否是我需要注意的事情,或者编译器是否知道如何处理。

【问题讨论】:

  • 你能解释一下PutImage的函数接口吗?每个参数的用途是什么?

标签: c pic rom pic18 c18


【解决方案1】:

好的相关问题及其答案让我(希望)走上正轨:Can I make a function that accepts both ram and rom pointers in Microchip C18?

还要感谢 Pandrei 指出 PutImage 的实现可能是原因。 我通过制作接受“near rom char *”的重复函数 PutROMImage 来使代码工作 -type 而不是默认为 ram 的“char*”。

因此 C18 不允许指针同时指向 ram 和 rom 并且 PutImage -function 参数默认为 ram。因此,传递一个指向位于 rom 中的数组的指针会导致指针指向随机值。

我没有注意到代码中的这种缺陷,编译器不够聪明,无法抱怨。

【讨论】:

    【解决方案2】:

    在 ROM(.txt 部分)或 RAM(.data 部分)中保存数据与您面临的问题无关。

    假设初始化是正确的并且你初始化了所有的元素(如果你不这样做,被忽略的元素将被默认初始化为0),问题可能出在函数的实现中:PutImage。 因为当大小改变时你会遇到问题,也许你有一些硬编码的值......

    【讨论】:

    • 请发布 PutImage 的实现,以便我们看到完整的图片。
    • 感谢您的回复。我添加了 PutImage 的实现。问题是 number -array 不适合 RAM,而 rom 将是不需要更改的东西的自然场所。
    • 什么意思它不适合 RAM?那它放在哪里呢?
    • 如果我没有将数组放在程序内存中,我会从链接器收到以下错误:“错误 - 节 'number' 不能适合该节。节 'number' 长度 = 0x00000514” 在这种情况下我在声明 number -array 之前有 'code'#pragma idata number"。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多