ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Вторник
23 июля
1221702 Топик полностью
VVB (08.07.2022 07:55, просмотров: 196) ответил abivan на подскажите как в кейле ARMCC определить Persistent область. для Pic32го было так
Я делаю изменения в двух файлах 

(для ARMCC)

В скрипте линкера размещаешь переменные BSS нужного тебе объектника в нужной области

LR_IROM1 FLASH_START FLASH_SIZE
{
... RW_IRAM2 +0 UNINIT 256 { LifeData.o (+BSS) }
}

И объявляешь переменные так, чтобы они были BSS типа:

LifeData.c:

static LifeData lifeData1;
static uint32_t crc32Data1;
static LifeData lifeData2;
static uint32_t crc32Data2;


Можно сделать через секции, скрипт будет так выглядеть (это я взял код из Amazon FreeRTOS):

    ; Place variables in the section that should not be initialized during the
    ; device startup.
    RW_IRAM1 +0 UNINIT
    {
        * (.noinit)
    }

Исходник:

/** To create cross compiler compatible code, use the CY_NOINIT, CY_SECTION, CY_UNUSED, CY_ALIGN
 * attributes at the first place of declaration/definition.
 * For example: CY_NOINIT uint32_t noinitVar;
 */
    #if (__ARMCC_VERSION >= 6010050)
        #define CY_NOINIT           __attribute__ ((section(".noinit")))
    #else
        #define CY_NOINIT           __attribute__ ((section(".noinit"), zero_init))
    #endif// (__ARMCC_VERSION >= 6010050)




(а это для GCC)

В скрипте линкера размещаешь придуманную тобой секцию .noInit в нужном ОЗУ:

    .noInit (NOLOAD) : {
        *(.noInit*)
    } > SRAM1

В объявлении переменной в исходнике (у меня сразу после объявления структуры "x" идёт объявление переменной "notInitDataInSram1"):

static __attribute__((section(".noInit"))) struct  x
{ uint32_t magicNumber; uint32_t mode; uint32_t flagHeaterWorking; uint32_t periodWave_us; } notInitDataInSram1;