Перейти к содержанию
    

Создание своей секции во флэш.

Я записываю системные параметры на последнюю страницу во флэш памяти микроконтролера.

Но  в линкер файле можно создать свою секцию, указать что она занимает последнюю страницу и из кода писать, читать в эту секцию.

Это будет то же самое? Компайлер автоматически добавит все действия для работы с флэш?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 hours ago, jenya7 said:

Я записываю системные параметры на последнюю страницу во флэш памяти микроконтролера. . . . 

А как записываете, через абсолютные адреса ? ПравильнЕЕ через линкерный файл, тогда можно расчитывать на его диагностику в случае явных и неявных косяков с адресацией. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 minutes ago, k155la3 said:

А как записываете, через абсолютные адреса ? ПравильнЕЕ через линкерный файл, тогда можно расчитывать на его диагностику в случае явных и неявных косяков с адресацией. 

сейчас я делаю так

FLASH_Status WriteToFlash(uint32_t flash_page)
{
    uint32_t *addr;
    uint32_t size;
    uint32_t offset;

    FLASH_Status status = FLASH_COMPLETE;
    
    // Clear All pending flags
    FLASH_ClearFlag (FLASH_FLAG_BSY | FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPERR); 

    //flash unlock
    if((FLASH->CR & FLASH_CR_LOCK) != RESET)
    {
		/* Authorize the FLASH Registers access */
	    FLASH->KEYR = FLASH_KEY1;
	    FLASH->KEYR = FLASH_KEY2;
    }

    status = FLASH_ErasePage(flash_page);

    if (status == FLASH_COMPLETE)
    {     
        FLASH->CR |= FLASH_CR_PG; /* Programm the flash */
      
        size = sizeof(MOTOR_SYS_PARAMS);
        offset = 0;
        addr = (uint32_t *)(flash_page + offset);
	flash_status = WriteFlash(&motor_sys_params, addr, size);
        
        size = sizeof(IR_DATA);
        offset += (size + SEPARATOR);
        addr = (uint32_t *)(flash_page + offset);
	flash_status = WriteFlash(&ir_data, addr, size);
        
        size = sizeof(GLOB_MOTOR_DATA);
        offset += (size + SEPARATOR);
        addr = (uint32_t *)(flash_page + offset);
	flash_status = WriteFlash(&glob_mot_data, addr, size);
            
        size = sizeof(MOTOR_TASK) * MAX_TASKS;
        offset += (size + SEPARATOR);
        addr = (uint32_t *)(flash_page + offset);
        flash_status = WriteFlash(&mot_task, addr, size);
        
        FLASH->CR &= ~FLASH_CR_PG; /* Reset the flag back !!!! */
	    
    }
    
    //flash lock
    FLASH->CR |= FLASH_CR_LOCK;
    
    return status;
}

а если я обращусь к секции - все действия , анлок, лок, ирейз и.т.д будут выполняться автоматически?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 minute ago, jenya7 said:

а если я обращусь к секции - все действия , анлок, лок, ирейз и.т.д будут выполняться автоматически?

С чего бы?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 минуты назад, jenya7 сказал:

а если я обращусь к секции - все действия , анлок, лок, ирейз и.т.д будут выполняться автоматически?

А откуда программа узнает про секции? Про них знает компилятор и линкер.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 minutes ago, aaarrr said:

С чего бы?

 

3 minutes ago, HardEgor said:

А откуда программа узнает про секции? Про них знает компилятор и линкер.

ну вот я вижу пример

#pragma section = ".versionsection"
const char version_full [] @ ".versionsection" = "VERSION 18.06.2010 15:25:40";

строка "VERSION 18.06.2010 15:25:40" теперь находиться в секции versionsection. как она туда попала?

 

 

ааа...кажется я понял. это происходит во время компиляции. не в ран-тайм.

Изменено пользователем jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 минуту назад, jenya7 сказал:

ну вот я вижу пример


#pragma section = ".versionsection"
const char version_full [] @ ".versionsection" = "VERSION 18.06.2010 15:25:40";

строка "VERSION 18.06.2010 15:25:40" теперь находиться в секции versionsection. как она туда попала?

Секции это для линкера.

Линкер увидел что в эту секцию надо разместить значение, ну и записал в прошивку - "по такому-то адресу записать такое-то значение".

А программа знает указанный абсолютный адрес. И может считать по этому адресу значение. Но, чтобы записать по этому адресу во флэш, то надо стереть страницу/секцию и только тогда записывать значение.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 minute ago, HardEgor said:

Секции это для линкера.

Линкер увидел что в эту секцию надо разместить значение, ну и записал в прошивку - "по такому-то адресу записать такое-то значение".

А программа знает указанный абсолютный адрес. И может считать по этому адресу значение. Но, чтобы записать по этому адресу во флэш, то надо стереть страницу/секцию и только тогда записывать значение.

ну это не интересно :) тогда секции бесполезны :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

25 minutes ago, jenya7 said:

ну это не интересно :) тогда секции бесполезны :)

. . . . пока Вы работаете в рамках одной страницы с небольшими фиксированными переменными.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 minutes ago, k155la3 said:

. . . . пока Вы работаете в рамках одной страницы с небольшими фиксированными переменными.

а если две страницы? мне как раз одной уже не хватает.

мне нужно динамически добавлять переменные.

Изменено пользователем jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

11 minutes ago, jenya7 said:

а если две страницы? мне как раз одной уже не хватает.

 

Будет выдаваться диагностика, что секция переполнена, и следующую надо размещать в новой странице флеши.

(как Вы определили, что  " как раз одной уже не хватает."  ?) - на этапе компиляции.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

31 minutes ago, k155la3 said:

Будет выдаваться диагностика, что секция переполнена, и следующую надо размещать в новой странице флеши.

(как Вы определили, что  " как раз одной уже не хватает."  ?) - на этапе компиляции.

 

так я и так знаю когда не хватает. где тут секция практически помогает?

 

если секция это страница, то в моем случае это 2К. я всегда знаю сколько места на странице осталось.

Изменено пользователем jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

19 minutes ago, jenya7 said:

так я и так знаю когда не хватает. где тут секция практически помогает?

А где видно, что есть попытка записи за границу страницы ? по "flash_status = "  ?

Но это будет видно только на этапе исполнения, хотя известно уже на этапе компиляции.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 minute ago, k155la3 said:

А где видно, что есть попытка записи за границу страницы ? по "flash_status = "  ?

Но это будет видно только на этапе исполнения, хотя известно уже на этапе компиляции.

пользователь создает задачи. задача это фиксированная структура. таким образом он может записать энное количество задачь на страницу. это происходит динамически.

скажем пользователь создал 10 задач и сохранил их на странице. при подъеме я считываю задачи проверяю на валидность и они бегут себе.

я думал с секциями можно работать динамически.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, jenya7 сказал:

ну это не интересно :) тогда секции бесполезны :)

Возьмете контроллер с меньшей памятью (или размер программы увеличится) и линкер вам сообщит если программа налезла на последнюю страницу. А без секций тупо запишет поверх ваших параметров код, и когда программа начнет исполнятся, то при записи во флэш внезапно всё упадёт в Hardfault.

 

9 минут назад, jenya7 сказал:

пользователь создает задачи. задача это фиксированная структура. таким образом он может записать энное количество задачь на страницу. это происходит динамически.

Где у вас структура? я вижу что какие-то отдельные параметры пишете во флэш.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...