PIC18 объявление и инициализация переменных отказывает в аппаратном обеспечении
Может ли кто-нибудь помочь с этим?
Вкратце: объявление и инициализация переменной не работает в аппаратном обеспечении PIC-в то время как это прекрасно работает в моделировании. Кроме того, эта проблема кажется еще более сложной, если переменная является структурой. Я использую: среду MPLAB х IDE В3.55, XC8 В1.41, PIC18F26K40 на борту Explorer 8 с кабельными отладчик PICKIT3.
Подробности:
Для простого случая, например:
uint8_t myvar = 0x55;
void main(void)
{
uint8_t var = myvar;
}
Используя окно переменных в отладчике myvar всегда равен нулю, когда я запускаю это в аппаратура. Но если я запускаю тот же код в симуляторе, все в порядке!
У меня есть:
- разбил задачу до простейшей формы, которая воспроизводит задачу
- пробовал отключить оптимизацию компилятора - что не исправляет этого
Проверка значений в окне отладчика "регистры файлов". Я не вижу 0x55 при запуске в аппаратном обеспечении-но он есть в симуляторе (по адресу 0x21).
Он работает в аппаратном обеспечении, если:
- myvar-это объявляется и инициализируется как const
- myvar объявляется и инициализируется локально (внутри main)
Теперь, если я использую тип структуры вместо простого uint8_t, как:
typedef struct {
uint8_t a;
char b[8];
}MYSTRUCT;
MYSTRUCT ms = { 0x55, "HELLO" };
void main(void)
{
uint8_t var = ms.a;
}
Переменная ms инициализируется правильно в симуляции, но не в аппаратном обеспечении. На этот раз он не инициализируется, если переменная объявлена в main или как глобальная. Опять же, объявление в качестве константы действительно работает. Так там вроде бы здесь несоответствия:
uint8_t struct type
global variable declaration and initialisation N N
global const declaration and initialisation Y Y
local variable declaration and initialisation Y N
После отладки и пошагового выполнения с файлом assembler (. as) это выглядит как myVar пытается быть инициализирован, но по какой-то причине просто не в аппаратном обеспечении. Ниже приведены соответствующие строки из файла. as. адрес и значение на ключевых этапах отображаются как захваченные из отладчика во время моделирования. Вы можете видеть в конце '_ _ pdataCOMRAM' (указатель в ОЗУ для myVar) присваивается 0x55. Если я шагаю через это в аппаратном обеспечении, все шаги идентичны, но когда мы добираемся до конца '_ _ pdataCOMRAM' не имеет значения 0x55, но 0x00.
Address Value
global __pdataCOMRAM
__pdataCOMRAM:
file "main.c"
line 32
global _myVar
myVar: 0x21 0x00
ds 1
file "dist/C18_18F87K22/debuginitTest.X.debug.as"
line #
psect cinit
; Initialize objects allocated to COMRAM (1 bytes)
global __pidataCOMRAM 0x144 0xff55
; load TBLPTR registers with __pidataCOMRAM
movlw low (__pidataCOMRAM)
movwf tblptrl
movlw high(__pidataCOMRAM)
movwf tblptrh
movlw low highword(__pidataCOMRAM)
movwf tblptru
tblrd*+ ;fetch initializer
movff tablat, __pdataCOMRAM+0 0x21 0x55
Я делаю что-то глупое здесь, или есть параметр компилятора, который я пропускаю, или это ошибка компилятора или отладчика? Я хотел бы понять эту проблему, чтобы в дальнейшем не попадать в какие-либо ловушки в своем развитии.
Ура!, Стив
1 ответ:
Похоже, что существует известная проблема кремния, останавливающая доступ к памяти программы сразу после сброса. Существует макрос ERRATA 'NVMREG' как обойти. Конкретные шаги для решения были: Компоновщик набора вариант проекта 'conf'и>'XC8 глобальные параметры'>'XC8' выберите категорию Дополнительные параметры, затем добавить NVMREG варианта исправления. Тогда все работало нормально. Кредит 1and0 на форуме микрочипов для этого!