jenya7 0 23 января, 2019 Опубликовано 23 января, 2019 · Жалоба Я записываю системные параметры на последнюю страницу во флэш памяти микроконтролера. Но в линкер файле можно создать свою секцию, указать что она занимает последнюю страницу и из кода писать, читать в эту секцию. Это будет то же самое? Компайлер автоматически добавит все действия для работы с флэш? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 26 23 января, 2019 Опубликовано 23 января, 2019 · Жалоба 2 hours ago, jenya7 said: Я записываю системные параметры на последнюю страницу во флэш памяти микроконтролера. . . . А как записываете, через абсолютные адреса ? ПравильнЕЕ через линкерный файл, тогда можно расчитывать на его диагностику в случае явных и неявных косяков с адресацией. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 23 января, 2019 Опубликовано 23 января, 2019 · Жалоба 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; } а если я обращусь к секции - все действия , анлок, лок, ирейз и.т.д будут выполняться автоматически? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 68 23 января, 2019 Опубликовано 23 января, 2019 · Жалоба 1 minute ago, jenya7 said: а если я обращусь к секции - все действия , анлок, лок, ирейз и.т.д будут выполняться автоматически? С чего бы? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HardEgor 66 23 января, 2019 Опубликовано 23 января, 2019 · Жалоба 2 минуты назад, jenya7 сказал: а если я обращусь к секции - все действия , анлок, лок, ирейз и.т.д будут выполняться автоматически? А откуда программа узнает про секции? Про них знает компилятор и линкер. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 23 января, 2019 Опубликовано 23 января, 2019 (изменено) · Жалоба 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. как она туда попала? ааа...кажется я понял. это происходит во время компиляции. не в ран-тайм. Изменено 23 января, 2019 пользователем jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HardEgor 66 23 января, 2019 Опубликовано 23 января, 2019 · Жалоба 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. как она туда попала? Секции это для линкера. Линкер увидел что в эту секцию надо разместить значение, ну и записал в прошивку - "по такому-то адресу записать такое-то значение". А программа знает указанный абсолютный адрес. И может считать по этому адресу значение. Но, чтобы записать по этому адресу во флэш, то надо стереть страницу/секцию и только тогда записывать значение. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 23 января, 2019 Опубликовано 23 января, 2019 · Жалоба 1 minute ago, HardEgor said: Секции это для линкера. Линкер увидел что в эту секцию надо разместить значение, ну и записал в прошивку - "по такому-то адресу записать такое-то значение". А программа знает указанный абсолютный адрес. И может считать по этому адресу значение. Но, чтобы записать по этому адресу во флэш, то надо стереть страницу/секцию и только тогда записывать значение. ну это не интересно :) тогда секции бесполезны :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 26 23 января, 2019 Опубликовано 23 января, 2019 · Жалоба 25 minutes ago, jenya7 said: ну это не интересно :) тогда секции бесполезны :) . . . . пока Вы работаете в рамках одной страницы с небольшими фиксированными переменными. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 23 января, 2019 Опубликовано 23 января, 2019 (изменено) · Жалоба 2 minutes ago, k155la3 said: . . . . пока Вы работаете в рамках одной страницы с небольшими фиксированными переменными. а если две страницы? мне как раз одной уже не хватает. мне нужно динамически добавлять переменные. Изменено 23 января, 2019 пользователем jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 26 23 января, 2019 Опубликовано 23 января, 2019 · Жалоба 11 minutes ago, jenya7 said: а если две страницы? мне как раз одной уже не хватает. Будет выдаваться диагностика, что секция переполнена, и следующую надо размещать в новой странице флеши. (как Вы определили, что " как раз одной уже не хватает." ?) - на этапе компиляции. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 23 января, 2019 Опубликовано 23 января, 2019 (изменено) · Жалоба 31 minutes ago, k155la3 said: Будет выдаваться диагностика, что секция переполнена, и следующую надо размещать в новой странице флеши. (как Вы определили, что " как раз одной уже не хватает." ?) - на этапе компиляции. так я и так знаю когда не хватает. где тут секция практически помогает? если секция это страница, то в моем случае это 2К. я всегда знаю сколько места на странице осталось. Изменено 23 января, 2019 пользователем jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 26 23 января, 2019 Опубликовано 23 января, 2019 · Жалоба 19 minutes ago, jenya7 said: так я и так знаю когда не хватает. где тут секция практически помогает? А где видно, что есть попытка записи за границу страницы ? по "flash_status = " ? Но это будет видно только на этапе исполнения, хотя известно уже на этапе компиляции. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 23 января, 2019 Опубликовано 23 января, 2019 · Жалоба 1 minute ago, k155la3 said: А где видно, что есть попытка записи за границу страницы ? по "flash_status = " ? Но это будет видно только на этапе исполнения, хотя известно уже на этапе компиляции. пользователь создает задачи. задача это фиксированная структура. таким образом он может записать энное количество задачь на страницу. это происходит динамически. скажем пользователь создал 10 задач и сохранил их на странице. при подъеме я считываю задачи проверяю на валидность и они бегут себе. я думал с секциями можно работать динамически. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HardEgor 66 23 января, 2019 Опубликовано 23 января, 2019 · Жалоба 1 час назад, jenya7 сказал: ну это не интересно :) тогда секции бесполезны :) Возьмете контроллер с меньшей памятью (или размер программы увеличится) и линкер вам сообщит если программа налезла на последнюю страницу. А без секций тупо запишет поверх ваших параметров код, и когда программа начнет исполнятся, то при записи во флэш внезапно всё упадёт в Hardfault. 9 минут назад, jenya7 сказал: пользователь создает задачи. задача это фиксированная структура. таким образом он может записать энное количество задачь на страницу. это происходит динамически. Где у вас структура? я вижу что какие-то отдельные параметры пишете во флэш. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться