jenya7 0 1 декабря, 2016 Опубликовано 1 декабря, 2016 · Жалоба объявляю так 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 так почему он не кладет туда? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gerber 7 1 декабря, 2016 Опубликовано 1 декабря, 2016 · Жалоба Вы смотрите переменные - указатели на строки. Переменные-указатели расположены в оперативной памяти, а их значения при инициализации программы - адреса строк во флэшке. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 61 1 декабря, 2016 Опубликовано 1 декабря, 2016 · Жалоба так почему он не кладет туда? Туда он кладет: const char * - это указатель на const char. Указатель, разумеется, не константный. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 1 декабря, 2016 Опубликовано 1 декабря, 2016 (изменено) · Жалоба Вы смотрите переменные - указатели на строки. Переменные-указатели расположены в оперативной памяти, а их значения при инициализации программы - адреса строк во флэшке. ааа...понял. а адрес присваевается в ран-тайм? при компиляции мы уже знаем адреса строки? Туда он кладет: const char * - это указатель на const char. Указатель, разумеется, не константный. я так понял в секции строка а в рам указатель на нее. кстати а где прописан адрес секции? Изменено 1 декабря, 2016 пользователем Jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 61 1 декабря, 2016 Опубликовано 1 декабря, 2016 · Жалоба я так понял в секции строка а в рам указатель на нее. Верно. Хотите все уложить во флеш - пишите const char * const; кстати а где прописан адрес секции? Нам отсюда не видно, но предположу, что где-нибудь в начале скрипта. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 1 декабря, 2016 Опубликовано 1 декабря, 2016 (изменено) · Жалоба Верно. Хотите все уложить во флеш - пишите 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 - нет указатели пусть будут в рам. :) кстати а для кортексов чтение из флеш медленее чем из рам? Изменено 1 декабря, 2016 пользователем Jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gerber 7 1 декабря, 2016 Опубликовано 1 декабря, 2016 · Жалоба ааа...понял. а адрес присваевается в ран-тайм? при компиляции мы уже знаем адреса строки? При компиляции (а точнее, при линковке) адрес строк во флэшке известен, а присваивание его указателю происходит в ран-тайм, в startup, который выполняется до входа в main(), там же, где инициализируются все глобальные переменные. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 61 1 декабря, 2016 Опубликовано 1 декабря, 2016 · Жалоба в линкере секции прописаны но их адреса не указаны. только адреса памяти .rodata : { . = ALIGN(4); __rodata_start__ = .; *(.rodata) /* .rodata sections (constants, strings, etc.) */ ... __rodata_start__ кстати а для кортексов чтение из флеш медленее чем из рам? Медленнее, и не только для кортексов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 1 декабря, 2016 Опубликовано 1 декабря, 2016 · Жалоба спасибо всем. а вот такой вопрос. я посылаю строку по UART. Parser_SendString(USART2, "Missing argument\r", print_out); я ее нигде не создавал. я передаю ее в качестве аргумента. вопрос - она будет создана в рам или временно в стэке и потом уничтожиться? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 61 1 декабря, 2016 Опубликовано 1 декабря, 2016 · Жалоба вопрос - она будет создана в рам или временно в стэке и потом уничтожиться? В вашем случае она будет размещена во флеш. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 181 2 декабря, 2016 Опубликовано 2 декабря, 2016 · Жалоба Верно. Хотите все уложить во флеш - пишите const char * const; Лучше: char const msg_misarg[] = "Missing argument\r"; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться