📄 demo-rom.c
字号:
// DATA STORED IN PROGRAM MEMORY
#pragma chip PIC18C252
// THE 'const' TYPE MODIFIER IS RECOMMENDED FOR ALL ROM DATA
const int16 tx[10] = { 1, 2, 1000, -34, -30000, 2, 100, 23, 0, 0};
const char str[] = "String 1";
const struct {
const char *str;
} txtp[] = {
"A table of pointer to strings",
"Monday", "Tuesday",
"MyString",
"MyString", // equal strings and substrings are merged to save space
"String", // merged with substring
};
// NOTE: const data that are not read are NOT stored!
const char notAccessed[] = "This data is not stored because it is not read";
void sub(uns8 i)
{
// reading the 'const' table
int16 t = tx[i];
const char *p = str;
i = *p;
p = "Hello world";
i = *p;
char si;
p = txtp[si].str;
i = *p;
}
// DATA CAN BE STORED DIRECTLY IN PROGRAM MEMORY
// NOTE: This is for special needs, when 'const' tables is not sufficient
#define CDATA_START 0x3000
#pragma cdata[CDATA_START] // start of cdata block
// STORE 16 bits data
#pragma cdata[] = 0xFFFF, 0x2000, 0x1000
// CONSTANT EXPRESSIONS ARE EVALUATED BEFORE STORING
#pragma cdata[] = 0x100, (10<<4) + 3456,\
10, 456, 10000
#define D8(l,h) l + h*128
#define D32(x) x%0x10000, x/0x10000
// STORE 8 AND 32 BITS DATA
#pragma cdata[] = D8(10,20), D32(10234543)
// AUTOMATIC ADDRESS CALCULATION
#pragma cdata.ID0 = 0x10, 200+3000
#pragma cdata.ID1 = "Hello world\0"
#pragma cdata.ID2 = "Another string\r\n" "merged"
// STORE A TABLE OF 16 BIT ADDRESSES TO ROM CODE
#pragma cdata.ID_TABLE = ID0, ID1, ID2 // store addresses
#pragma cdata.CDATA_END // end of cdata block
#pragma origin CDATA_END // program code follow right after
void write(uns16 strID)
{
// ..
}
/* NOTE: functions using labels in the directly stored data must be
defined after the data definitions */
void pointers( void)
{
write(ID1);
write(ID2);
char i = 2; // index of ID2
TBLPTR = i * 2;
TBLPTR += ID_TABLE;
write( *TBLPTR);
// low level access of program memory:
TBLPTR = ID0;
char m = *TBLPTR; // READ PROGRAM MEMORY
m = *TBLPTR++; // READ PROGRAM MEMORY AND INCREMENT POINTER
m = *TBLPTR--; // READ PROGRAM MEMORY AND DECREMENT POINTER
m = *++TBLPTR; // INCREMENT POINTER AND READ PROGRAM MEMORY
}
void main(void)
{
sub(3);
pointers();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -