Внимание! Очередной баг в PICC-18 9.51pl2. Если что-то в секции const (или аналогичной) размещается по адресу 0xffff и значит считывается через инструкци TBLRD+, то в виду автоинкремента TBLPTRU устанавливается в 1. Но компилятор с ключём --cp=16 не следит за TBLPTRU и не (пере)устанавливает его никогда!
Решение проблемы следующее: завести секцию из одного байта и насильно разместить её по адресу 0xffff (в программной памяти), что не даст секции const попадать в этот адрес.
В исходнике пишем:
asm("psect bugffff,global,class=CODE,delta=1");
asm("ds 1");
В компиляторе секция размещается по нужному адресу с помощью ключа -L-pbugffff=0ffffh
(в MPLAB Project -> Build Options -> Project, далее выбираем вкладку Global в окне "Additional command line..." вводим ключ и нажимаем кнопку "Add...")
Описываемая проблема актуальна для микроконтроллеров с объёмом программной памяти больше 64КБайта и реализованным регистром TBLPTRU. Вне зависимости от того сколько программной памяти используется (const может быть размещён как раз в конце памяти).
[ZX]
-
- Проще ограничить используемую память: --rom=default,-ffff-ffff - PIC32(02.03.2010 22:05)