У меня есть простая и быстрая проблема с C в компиляторе PIC24f16ka102 и xc16.Переменный адрес в пространстве eeprom как аргумент функции в C
Я хочу передать переменную ссылку на мою функцию. Переменный находится в ЭСППЗУ пространстве:
int __attribute__ ((space(eedata))) eeData; // Variable located in EEPROM,declared as a global variable.
С этой последовательностью я могу сохранить некоторые данные в ЭСППЗУ:
unsigned int offset;
// Set up NVMCON to erase one word of data EEPROM
NVMCON = 0x4004;
// Set up a pointer to the EEPROM location to be erased
TBLPAG = __builtin_tblpage(&eeData2); // Initialize EE Data page pointer
testDebug = TBLPAG;
offset = __builtin_tbloffset(&eeData); // Initizlize lower word of address
__builtin_tblwtl(offset, 0x9876); // Write EEPROM data to write latch
asm volatile ("disi #5"); // Disable Interrupts For 5 Instructions
__builtin_write_NVM(); // Issue Unlock Sequence & Start Write Cycle
while(NVMCONbits.WR == 1);
Таким образом, я пишу значение 0x9876 для первых 16 битых ППЗА. Но мне нужно, чтобы иметь его в качестве &eeData
Я хочу написать свою собственную функцию:
void eeprom_writeWord(unsigned int __attribute__ ((space(eedata))) addresOfMyEEpromVariable, unsigned int value)
{
unsigned int offset;
// Set up NVMCON to erase one word of data EEPROM
NVMCON = 0x4004;
// Set up a pointer to the EEPROM location to be erased
TBLPAG = __builtin_tblpage(&addresOfMyEEpromVariable); // Initialize EE Data page pointer
offset = __builtin_tbloffset(&addresOfMyEEpromVariable); // Initizlize lower word of address
__builtin_tblwtl(offset, value); // Write EEPROM data to write latch
asm volatile ("disi #5"); // Disable Interrupts For 5 Instructions
__builtin_write_NVM(); // Issue Unlock Sequence & Start Write Cycle
while(NVMCONbits.WR == 1);
}
но Как передать свой адрес в качестве аргумента функции, так что моя функция будет видеть, что он по-прежнему адресу в эпром пространство? Это не может быть просто адрес, потому что если я получаю ошибку. Для функций __builtin необходим адрес с некоторым атрибутом, который является памятью eeprom.
Как передать адрес eeprom с атрибутом моей функции? Пожалуйста, помогите
редактировать:
Спасибо за совет, но я все еще получаю ту же ошибку:
error: Argument to __builtin_tbloffset() is not the address
of an object in a code, psv, or eedata section;
функции встроенные функции __builtin_tblpage нужен адрес памяти EEPROM, а не только адрес чего-то , Он работает хорошо, если я использую всю последовательность, но не в функции (я имею в виду последовательность в моем первом сообщении).
Теперь я попытался, как Вы сказали:
void eeprom_writeWord(unsigned int *addresOfMyEEpromVariable, unsigned int value)
{
//write word
// Set up NVMCON to write one word of data EEPROM
NVMCON = 0x4004;
// Set up a pointer to the EEPROM location to be written
TBLPAG = __builtin_tblpage(*addresOfMyEEpromVariable);
unsigned int offset = __builtin_tbloffset(*addresOfMyEEpromVariable);
// Write Data Value To Holding Latch
__builtin_tblwtl(offset, 0x9999);
// Disable Interrupts For 5 Instructions
asm volatile ("disi #5");
// Issue Unlock Sequence & Start Write Cycle
__builtin_write_NVM();
while(NVMCONbits.WR == 1);
}
или даже без знака '*':
void eeprom_writeWord(unsigned int *addresOfMyEEpromVariable, unsigned int value)
{
//write word
// Set up NVMCON to write one word of data EEPROM
NVMCON = 0x4004;
// Set up a pointer to the EEPROM location to be written
TBLPAG = __builtin_tblpage(addresOfMyEEpromVariable);
unsigned int offset = __builtin_tbloffset(addresOfMyEEpromVariable);
// Write Data Value To Holding Latch
__builtin_tblwtl(offset, 0x9999);
// Disable Interrupts For 5 Instructions
asm volatile ("disi #5");
// Issue Unlock Sequence & Start Write Cycle
__builtin_write_NVM();
while(NVMCONbits.WR == 1);
}
Результат все тот же. __builtin_tblpage и другие функции __builtin _ (...) - это функции, встроенные в компилятор xc16.
Начните с форматирования кода! –