ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
25 апреля
920289 Топик полностью
Nikolay_Po (10.05.2019 13:56 - 14:01, просмотров: 348) ответил VLLV на Не расстраивайте меня. 1)ну не дает компилятор создать переменную volatile const! 2)hardfault - это последствия неправильного выполнения операции взятия адреса, мы же не последствия разбираем, а причину.
1) Из инструкции к Microchip XC16 v1.36b: 
10.4.2.1 MANAGED PSV ACCESS The compiler introduces several new qualifiers (or more specifically, CV-qualifiers). Like a const volatile qualifier, the new qualifiers can be applied to objects or pointer targets. These qualifiers are: • __psv__ for accessing objects that do not cross a PSV boundary, such as those allocated in space(auto_psv) or space(psv) • __prog__ for accessing objects that may cross a PSV boundary, specifically those allocated in space(prog), but it may be applied to any object in Flash • __eds__ for accessing objects that may be in Flash or the extended data space (for devices with > 32K of RAM), see __eds__ in Section 10.7 “Extended Data Space Access.”. Typically there is no need to specify __psv__ or __prog__ for an object placed in space(auto_psv). Defining a variable in a compiler managed Flash space is accomplished by: __ psv __ unsigned int Flash_variable __ attribute __ ((space(psv))); Reading from the variable now will cause the compiler to generate code that adjusts the appropriate PSV page SFR as necessary to access the variable correctly. These qualifiers can equally decorate pointers: __ psv __ unsigned int *pFlash; produces a pointer to something in PSV, which can be assigned to a managed PSV object in the normal way. For example: pFlash = &Flash_variable;
Как я понимаю мануал, специальное объявление констант делает их volatile. 2) Надо разбираться. Сейчас пытаюсь в XC16 воспроизвести проблему, подобную IAR. Компилятор пока не даёт выстрелить себе в ногу. Использовать константы разрешает, а при попытке создать указатель на константу ругается: "error: initialization from pointer to non-enclosed address space" если декларирую указатель как простой указатель на константу, без квалификатора и атрибута размещения в ПЗУ. Указатель с квалификатором и атрибутом размещения цели в ПЗУ, не удаётся использовать указатели в коде: "error: Inappropriate program address 'NormalPointer'". Если чего накопаю - отпишусь.