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 2

1 ответ:

Похоже, что существует известная проблема кремния, останавливающая доступ к памяти программы сразу после сброса. Существует макрос ERRATA 'NVMREG' как обойти. Конкретные шаги для решения были: Компоновщик набора вариант проекта 'conf'и>'XC8 глобальные параметры'>'XC8' выберите категорию Дополнительные параметры, затем добавить NVMREG варианта исправления. Тогда все работало нормально. Кредит 1and0 на форуме микрочипов для этого!