|
|
  |
Компайлер не помещает строки во флеш. |
|
|
|
Dec 1 2016, 13:02
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
объявляю так Код const char *msg_misarg = "Missing argument\r"; const char *msg_invarg = "Invalid argument\r"; const char *msg_invinp = "Invalid input\r"; иду в мэп файл и вижу. Код .data.msg_invarg 0x2000011c 0x4 src\parser.o 0x2000011c msg_invarg .data.msg_invinp 0x20000120 0x4 src\parser.o 0x20000120 msg_invinp я понимаю что const это только рекомендация. а как порекомендовать посильнее? создать секцию в линкере? но там уже есть секция для констант Код /* Constant data goes into FLASH */ .rodata : { . = ALIGN(4); *(.rodata) /* .rodata sections (constants, strings, etc.) */ *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ . = ALIGN(4); } >FLASH так почему он не кладет туда?
|
|
|
|
|
Dec 1 2016, 13:17
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Цитата(gerber @ Dec 1 2016, 18:10)  Вы смотрите переменные - указатели на строки. Переменные-указатели расположены в оперативной памяти, а их значения при инициализации программы - адреса строк во флэшке. ааа...понял. а адрес присваевается в ран-тайм? при компиляции мы уже знаем адреса строки? Цитата(aaarrr @ Dec 1 2016, 18:12)  Туда он кладет: const char * - это указатель на const char. Указатель, разумеется, не константный. я так понял в секции строка а в рам указатель на нее. кстати а где прописан адрес секции?
Сообщение отредактировал Jenya7 - Dec 1 2016, 13:18
|
|
|
|
|
Dec 1 2016, 13:22
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(Jenya7 @ Dec 1 2016, 16:17)  я так понял в секции строка а в рам указатель на нее. Верно. Хотите все уложить во флеш - пишите const char * const; Цитата(Jenya7 @ Dec 1 2016, 16:17)  кстати а где прописан адрес секции? Нам отсюда не видно, но предположу, что где-нибудь в начале скрипта.
|
|
|
|
|
Dec 1 2016, 13:30
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Цитата(aaarrr @ Dec 1 2016, 18:22)  Верно. Хотите все уложить во флеш - пишите const char * const;
Нам отсюда не видно, но предположу, что где-нибудь в начале скрипта. в линкере секции прописаны но их адреса не указаны. только адреса памяти Код /* Specify the memory areas */ MEMORY { FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 256K RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 64K MEMORY_B1 (rx) : ORIGIN = 0x60000000, LENGTH = 0K } const char * const - нет указатели пусть будут в рам.  кстати а для кортексов чтение из флеш медленее чем из рам?
Сообщение отредактировал Jenya7 - Dec 1 2016, 13:38
|
|
|
|
|
Dec 1 2016, 13:50
|
Знающий
   
Группа: Участник
Сообщений: 750
Регистрация: 1-11-11
Пользователь №: 68 088

|
Цитата(Jenya7 @ Dec 1 2016, 16:17)  ааа...понял. а адрес присваевается в ран-тайм? при компиляции мы уже знаем адреса строки? При компиляции (а точнее, при линковке) адрес строк во флэшке известен, а присваивание его указателю происходит в ран-тайм, в startup, который выполняется до входа в main(), там же, где инициализируются все глобальные переменные.
--------------------
"... часами я мог наблюдать, как люди работают." (М. Горький)
|
|
|
|
|
Dec 1 2016, 13:52
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(Jenya7 @ Dec 1 2016, 16:30)  в линкере секции прописаны но их адреса не указаны. только адреса памяти Код .rodata : { . = ALIGN(4); __rodata_start__ = .; *(.rodata) /* .rodata sections (constants, strings, etc.) */ ... __rodata_start__ Цитата(Jenya7 @ Dec 1 2016, 16:30)  кстати а для кортексов чтение из флеш медленее чем из рам? Медленнее, и не только для кортексов.
|
|
|
|
|
Dec 1 2016, 15:10
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
спасибо всем. а вот такой вопрос. я посылаю строку по UART. Код Parser_SendString(USART2, "Missing argument\r", print_out); я ее нигде не создавал. я передаю ее в качестве аргумента. вопрос - она будет создана в рам или временно в стэке и потом уничтожиться?
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|