2

我正在努力理解为什么我在尝试从存储在 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 时,我不确定这是否是我需要注意的事情,或者编译器是否知道如何处理它。

4

2 回答 2

1

好的相关问题及其答案让我(希望)走上正轨:我可以在 Microchip C18 中创建一个同时接受 ram 和 rom 指针的函数吗?

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

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

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

于 2013-12-02T13:17:10.960 回答
0

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

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

于 2013-12-02T11:40:51.340 回答