STM32 новичку в ARM что к чему
- Сообщения: 2567
- Зарегистрирован: Вт май 01, 2018 19:44:47
[uquote="Zhuk72",url="/forum/viewtopic.php?p=3883767#p3883767"]Можете через typedef определить эти уинты.[/uquote]В нескольких местах определять типа, да ещё переопределяя стандартные - грубая ошибка!
- Реклама
- Сообщения: 1379
- Зарегистрирован: Вт ноя 19, 2019 06:10:18
Как правильно попросить линковщик положить мой массив по абсолютному адресу внутри флэш? Раньше пользовался at(), а в GCC она не поддерживается, и алгоритма действий для её замены не могу найти. Ещё оговорка: область моего массива может быть не последними адресами флэш.
в GCC есть секции и скрипт линкера. секций обычно достаточно, скрипт надо править для экзотических требований.tonyk писал(а):пользовался at(), а в GCC она не поддерживается
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 1379
- Зарегистрирован: Вт ноя 19, 2019 06:10:18
[uquote="ARV",url="/forum/viewtopic.php?p=3883811#p3883811"]
Так это и ежу понятно. Я не вижу способа как внутрь секции с кодом втиснуть мой массив.
в GCC есть секции и скрипт линкера. секций обычно достаточно, скрипт надо править для экзотических требований.[/uquote]tonyk писал(а):пользовался at(), а в GCC она не поддерживается
Так это и ежу понятно. Я не вижу способа как внутрь секции с кодом втиснуть мой массив.
- Сообщения: 2516
- Зарегистрирован: Пт июл 12, 2019 22:52:01
tonyk, у меня на гитхабе в stm32samples есть пример: я там выделил во флеше 1 блок для хранения настроек, а все остальное - под логи. На секциях.
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Я на гитхабе, в ЖЖ
- Реклама
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
[uquote="tonyk",url="/forum/viewtopic.php?p=3883785#p3883785"]Раньше пользовался at()[/uquote]
может так (без правки скрипта линкера):
из Example Code snippets covering STM32 F0 series
https://www.st.com/en/embedded-software ... etsf0.html
может так (без правки скрипта линкера):
Код: Выделить всё
#define FLASH_PAGE_SIZE ((uint32_t)0x00000400) /* FLASH Page Size */
#define FLASH_USER_START_ADDR ((uint32_t)0x08002000) /* Start @ of user
......
FlashErase(FLASH_USER_START_ADDR);
CheckFlashErase(FLASH_USER_START_ADDR);
FlashWord16Prog(FLASH_USER_START_ADDR, (uint16_t)DATA_TO_PROG);
FlashWord16Prog(FLASH_USER_START_ADDR + 2, (uint16_t)(DATA_TO_PROG >> 16));
/* Check the programming of the address */
if ((*(uint32_t *)(FLASH_USER_START_ADDR)) != DATA_TO_PROG)
{
error |= ERROR_PROG;
}https://www.st.com/en/embedded-software ... etsf0.html
- Сообщения: 1379
- Зарегистрирован: Вт ноя 19, 2019 06:10:18
[uquote="oleg110592",url="/forum/viewtopic.php?p=3883815#p3883815"][uquote="tonyk",url="/forum/viewtopic.php?p=3883785#p3883785"]Раньше пользовался at()[/uquote]
может так (без правки скрипта линкера):
из Example Code snippets covering STM32 F0 series
https://www.st.com/en/embedded-software ... etsf0.html[/uquote]
Добавлено after 2 minutes 42 seconds:
Добавлено after 18 minutes 40 seconds:
Нашёл. Благодарю! Щас обмозгую.
Добавлено after 6 minutes 6 seconds:
Хм, 1К зарезервировано, это понятно как. А как их разаместить с нужного адреса? Такого в примере нет.
Ещё уточнения:
а) как все уже, наверно, догадались, это нужно для возможности записи моих данных во флэш;
б) у STM32F746 размер страниц флэш разный, мне нужны две штуки по 32К, а не одна на 128К, поэтому и нужно положить секцию по конкретным адресам.
может так (без правки скрипта линкера):
Код: Выделить всё
#define FLASH_PAGE_SIZE ((uint32_t)0x00000400) /* FLASH Page Size */
#define FLASH_USER_START_ADDR ((uint32_t)0x08002000) /* Start @ of user
......
FlashErase(FLASH_USER_START_ADDR);
CheckFlashErase(FLASH_USER_START_ADDR);
FlashWord16Prog(FLASH_USER_START_ADDR, (uint16_t)DATA_TO_PROG);
FlashWord16Prog(FLASH_USER_START_ADDR + 2, (uint16_t)(DATA_TO_PROG >> 16));
/* Check the programming of the address */
if ((*(uint32_t *)(FLASH_USER_START_ADDR)) != DATA_TO_PROG)
{
error |= ERROR_PROG;
}https://www.st.com/en/embedded-software ... etsf0.html[/uquote]
Вот в чём дело-то. Как линкёр зарезервирует место под мой массив? Причём внутри секции.Я не вижу способа как внутрь секции с кодом втиснуть мой массив.
Добавлено after 2 minutes 42 seconds:
Их там много. Ткни пальцем в нужный.у меня на гитхабе в stm32samples есть пример: я там выделил во флеше 1 блок для хранения настроек
Добавлено after 18 minutes 40 seconds:
Код: Выделить всё
.myvars :
{
. = ALIGN(1024);
__varsstart = ABSOLUTE(.);
KEEP(*(.myvars));
} > rom Добавлено after 6 minutes 6 seconds:
Хм, 1К зарезервировано, это понятно как. А как их разаместить с нужного адреса? Такого в примере нет.
Ещё уточнения:
а) как все уже, наверно, догадались, это нужно для возможности записи моих данных во флэш;
б) у STM32F746 размер страниц флэш разный, мне нужны две штуки по 32К, а не одна на 128К, поэтому и нужно положить секцию по конкретным адресам.
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
[uquote="tonyk",url="/forum/viewtopic.php?p=3883818#p3883818"]Причём внутри секции.[/uquote]
просто интересно - почему массив снаружи секции не подходит?
просто интересно - почему массив снаружи секции не подходит?
- Сообщения: 1379
- Зарегистрирован: Вт ноя 19, 2019 06:10:18
[uquote="oleg110592",url="/forum/viewtopic.php?p=3883831#p3883831"][uquote="tonyk",url="/forum/viewtopic.php?p=3883818#p3883818"]Причём внутри секции.[/uquote]
просто интересно - почему массив снаружи секции не подходит?[/uquote]
просто интересно - почему массив снаружи секции не подходит?[/uquote]
- Вложения
-
- Screenshot_246.jpg
- (62.08 КБ) 242 скачивания
[uquote="VladislavS",url="/forum/viewtopic.php?p=3883781#p3883781"][uquote="Zhuk72",url="/forum/viewtopic.php?p=3883767#p3883767"]Можете через typedef определить эти уинты.[/uquote]В нескольких местах определять типа, да ещё переопределяя стандартные - грубая ошибка![/uquote]
Были бы они такие прямо стандартные, не приходилось бы подключать отдельным хедером. А так был вопрос про вариант - ну, вот он вариант. Правильный или нет - другое дело. Гораздо проще было в исходниках сменить все uint... на unsigned... - минутное дело - чем выискивать вариант с подключением дополнительных заголовков.
У меня тоже в каких-то компиляторах уинты изначально работают, в каких-то нет. Но я по привычке использую только unsigned char и пр., хотя это и длиннее.
Были бы они такие прямо стандартные, не приходилось бы подключать отдельным хедером. А так был вопрос про вариант - ну, вот он вариант. Правильный или нет - другое дело. Гораздо проще было в исходниках сменить все uint... на unsigned... - минутное дело - чем выискивать вариант с подключением дополнительных заголовков.
У меня тоже в каких-то компиляторах уинты изначально работают, в каких-то нет. Но я по привычке использую только unsigned char и пр., хотя это и длиннее.
Каждый имеет право на свое личное ошибочное мнение.
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
[uquote="tonyk",url="/forum/viewtopic.php?p=3883834#p3883834"]А как их разаместить с нужного адреса?[/uquote]
тут быть может
https://stackoverflow.com/questions/408 ... r-commands
тут быть может
https://stackoverflow.com/questions/408 ... r-commands
дык...tonyk писал(а):Я не вижу способа как внутрь секции с кодом втиснуть мой массив
Код: Выделить всё
int my_array[1024] __attribute__((section(MY_SECTION_NAME))) = {1,2,3,4,5,6,7, ...};вот и будет массив в нужной секции, а секция по нужному адресу...
или в ARM-GCC все не так?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 7049
- Зарегистрирован: Сб янв 28, 2006 22:47:24
[uquote="Zhuk72",url="/forum/viewtopic.php?p=3883844#p3883844"]Гораздо проще было в исходниках сменить все uint... на unsigned[/uquote]
Каких-то нехороших последствий не последует? Просто заменить и все?
Каких-то нехороших последствий не последует? Просто заменить и все?
Астролябия-сама меряет, было бы что мерять!!!
- Сообщения: 1379
- Зарегистрирован: Вт ноя 19, 2019 06:10:18
[uquote="ARV",url="/forum/viewtopic.php?p=3883856#p3883856"]а в командной строке потом добавляете параметр -Wl,--section-start=MY_SECTION_NAME=0x802000
вот и будет массив в нужной секции, а секция по нужному адресу...
или в ARM-GCC все не так?[/uquote]
Блин, ну посмотрите же на картинку!
дык...tonyk писал(а):Я не вижу способа как внутрь секции с кодом втиснуть мой массив
Код: Выделить всё
int my_array[1024] __attribute__((section(MY_SECTION_NAME))) = {1,2,3,4,5,6,7, ...};вот и будет массив в нужной секции, а секция по нужному адресу...
или в ARM-GCC все не так?[/uquote]
Блин, ну посмотрите же на картинку!
- Вложения
-
- Screenshot_246.jpg
- (62.08 КБ) 226 скачиваний
[uquote="Asmodey",url="/forum/viewtopic.php?p=3883858#p3883858"][uquote="Zhuk72",url="/forum/viewtopic.php?p=3883844#p3883844"]Гораздо проще было в исходниках сменить все uint... на unsigned[/uquote]
Каких-то нехороших последствий не последует? Просто заменить и все?[/uquote]
uint8_t = unsigned char
uint16_t = unsigned int
uint32_t = unsigned long
Левые без u будут signed.
Во всяком случае в Keil и Мплаб 8, 16 и 32-битные данным соответствуют именно char, int и long. IAR не использую, но скорее всего там так же будет.
Каких-то нехороших последствий не последует? Просто заменить и все?[/uquote]
uint8_t = unsigned char
uint16_t = unsigned int
uint32_t = unsigned long
Левые без u будут signed.
Во всяком случае в Keil и Мплаб 8, 16 и 32-битные данным соответствуют именно char, int и long. IAR не использую, но скорее всего там так же будет.
Каждый имеет право на свое личное ошибочное мнение.
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
Я бы сказал, что скорее
uint16_t = unsigned short
uint16_t = unsigned short
во-первых, картинку вставлять по-человечески надо, а во-вторых, что я там должен увидеть? адрес, который вам нужен, вы можете сами написать правильный в командной строке. или в чем дело-то?tonyk писал(а):посмотрите же на картинку!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 1379
- Зарегистрирован: Вт ноя 19, 2019 06:10:18
Какой тут редактор, так и вставляется.картинку вставлять по-человечески надо
В перекрытии адресов. Я ведь спрашивал, как внутри секции с кодом разместить массив? Ручная привязка файлов к секциям- не вариант, ибо файлов много. На картинке показано почему и зачем это нужно.или в чем дело-то?
про секцию кода прозевал.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
[uquote="WiseLord",url="/forum/viewtopic.php?p=3883875#p3883875"]Я бы сказал, что скорее
uint16_t = unsigned short[/uquote]
Сейчас уточнил. Keil Cx51 компилятор и Microchip XC8 short и int оба считают 16-битным типом.
А вот Keil ARM сказал, что int - это 32 бита. Я это и раньше читал, но как-то упустил.
Буду иметь в виду.
uint16_t = unsigned short[/uquote]
Сейчас уточнил. Keil Cx51 компилятор и Microchip XC8 short и int оба считают 16-битным типом.
А вот Keil ARM сказал, что int - это 32 бита. Я это и раньше читал, но как-то упустил.
Буду иметь в виду.
Каждый имеет право на свое личное ошибочное мнение.
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.


