-
- дополнил про __CACHE_REGION_SIZE - Constantin24(15.09.2022 15:44)
- __CACHE_REGION_SIZE=0 у линкера, по-моему, не гарантирует, что после объявления этого параметра в качестве указателя как extern uint32_t __CACHE_REGION_SIZE[], обращение к указателю даст то же самое значение. Объявляйте параметр как беззнаковое целое число, так как size - это разница адресов, а она, из указателей, превращается в целое. То есть, size, в принципе, не может быть указателем. Это просто число позиций, а не адрес. - Nikolay_Po(15.09.2022 17:15)
- а с чего вы считаете, что __CACHE_REGION_SIZE == 0 ?
__CACHE_REGION_SIZE это указатель, то что он на область размером 0
указывает ничего не меняет - Oman(15.09.2022 15:24 - 15:27)
- +1 - Nikolay_Po(15.09.2022 15:25)
- Сделали из указателя __CACHE_REGION_SIZE целое число? Я бы
сравнивал без преобразования типа, Nikolay_Po(274 знак., 15.09.2022 15:24)
- Очевидно, __CACHE_REGION_SIZE задаётся на уровне линкера, такие
вещи передаются в код в виде адресов внешних символов. Обычное
дело. - SciFi(15.09.2022 15:25)
- Почему __CACHE_REGION_SIZE объявлен как указатель? Если он и есть
указатель, то и обращаться с ним нужно соответственно. Что ожидает
программист от превращения указателя в целое число приведением
типа? Адрес?
Почему тогда размер массива объявлен нулевым? Если не существует объекта, на который указывает указатель, то какого значения мы ждём от указателя?Nikolay_Po(46 знак., 15.09.2022 15:31 - 15:33)- Вы не в теме. См. сюда >>> SciFi(1 знак., 15.09.2022 15:36, ссылка)
- Массив через extern, Размер тут его не указывается. Сам массив
объявлен где-то и линкер его найдет. И там будет адрес. Ненулевой. - POV(15.09.2022 15:33)
- Спасибо, почему-то вообразил [0]. Если адрес не нулевой, то почему
ТС удивляется приращению i? - Nikolay_Po(15.09.2022 15:36)
- А хто ж его знает )) - POV(15.09.2022 15:49)
- Спасибо, почему-то вообразил [0]. Если адрес не нулевой, то почему
ТС удивляется приращению i? - Nikolay_Po(15.09.2022 15:36)
- Почему __CACHE_REGION_SIZE объявлен как указатель? Если он и есть
указатель, то и обращаться с ним нужно соответственно. Что ожидает
программист от превращения указателя в целое число приведением
типа? Адрес?
- Очевидно, __CACHE_REGION_SIZE задаётся на уровне линкера, такие
вещи передаются в код в виде адресов внешних символов. Обычное
дело. - SciFi(15.09.2022 15:25)
- Давайте в дизассемблер посмотрим. Там кода всего ничего. - SciFi(15.09.2022 14:37)
- Вот Constantin24(1 знак., 15.09.2022 14:40, картинка)
- Отбой, это не баг. Компилятор считает, что адрес не может быть
нулевым, потому что нулевой указатель не может указывать ни на
какой объект, в том числе __CACHE_REGION_SIZE. Вот такая фигня. - SciFi(15.09.2022 15:30)
- 1) Можете пояснить более подробно(или ссылку на чтение), никак не
могу понять ваше объяснение: почему адрес не может быть нулевым? Constantin24(166 знак., 15.09.2022 16:04)
- В стандарте языка Си написано про нулевой указатель. Писать никому
не надо, они скажут "не баг, а фича" и будут правы с формальной
точки зрения, да и по сути, наверное, тоже. SciFi(304 знак., 15.09.2022 16:50)
- спасибо за инфу! - Constantin24(15.09.2022 17:28)
- В стандарте языка Си написано про нулевой указатель. Писать никому
не надо, они скажут "не баг, а фича" и будут правы с формальной
точки зрения, да и по сути, наверное, тоже. SciFi(304 знак., 15.09.2022 16:50)
- Пробовал и таким образом: Constantin24(249 знак., 15.09.2022 15:36)
- Ну да, volatile точно победит, потому что компилятор считает, что
содержимое такого объекта может измениться в любой момент. Был не
ноль, а потом стал ноль: SciFi(116 знак., 15.09.2022 15:39)
- что на счет uint32_t size = (uint32_t)&__CACHE_REGION_SIZE; - Constantin24(15.09.2022 15:44)
- Никак не пойму "физический смысл" интерпретации размера (size) как
адреса. Где-то тут ошибка. Или это перечень адресов, по которым
указаны размеры областей кэша? - Nikolay_Po(15.09.2022 17:19)
- Аналогично, все взято с примеров. Дело в то, что
__CACHE_REGION_SIZE указан в LinkerScript типа flash_debug.ld.
Чтобы получит ее значение нужно выполнить такие действия. - Constantin24(15.09.2022 17:27)
- Получайте напрямую, как целое. В конце концов, вы не адрес объекта
получаете, а размер. Единицы измерения - под вопросом, но, главное,
не нужно обращаться к параметру как к указателю. Нет для этого
никаких предпосылок. ПМСМ. - Nikolay_Po(15.09.2022 17:32)
- Вы не в теме. - SciFi(15.09.2022 17:33)
- представленный код от производителя - Constantin24(15.09.2022 17:33)
- Это не снимает моих вопросов. - Nikolay_Po(15.09.2022 18:54)
- Тема раскрыта в мануале >>> SciFi(1 знак., 15.09.2022 19:33, ссылка)
- Спасибо. Нарочно вас провоцировал, чтобы ткнули носом. Собственно,
из последнего примера: Nikolay_Po(779 знак., 15.09.2022 20:11)
- Там же есть пример "_foo = 1000". И дальше сами решайте, будет это адрес 1000 или 1000 попугаев. И то, и другое имеет право на жизнь. Ограничение "только адреса" придумали вы сами, вам и искать подтверждение этому. В своей практике передавал таким способом произвольные числа, полёт нормальный. - SciFi(15.09.2022 20:16)
- Спасибо. Нарочно вас провоцировал, чтобы ткнули носом. Собственно,
из последнего примера: Nikolay_Po(779 знак., 15.09.2022 20:11)
- Тема раскрыта в мануале >>> SciFi(1 знак., 15.09.2022 19:33, ссылка)
- Это не снимает моих вопросов. - Nikolay_Po(15.09.2022 18:54)
- Дык у них пример с подставой. Они тоже всего лишь люди. В качестве
костыляминимальной правки я бы сделал так, как указал выше: SciFi(1 знак., 15.09.2022 17:31, ссылка)
- Получайте напрямую, как целое. В конце концов, вы не адрес объекта
получаете, а размер. Единицы измерения - под вопросом, но, главное,
не нужно обращаться к параметру как к указателю. Нет для этого
никаких предпосылок. ПМСМ. - Nikolay_Po(15.09.2022 17:32)
- Аналогично, все взято с примеров. Дело в то, что
__CACHE_REGION_SIZE указан в LinkerScript типа flash_debug.ld.
Чтобы получит ее значение нужно выполнить такие действия. - Constantin24(15.09.2022 17:27)
- Если arr объявлен как массив (char arr[]), то "arr" и "&arr" — это одно и то же. - SciFi(15.09.2022 15:55)
- Никак не пойму "физический смысл" интерпретации размера (size) как
адреса. Где-то тут ошибка. Или это перечень адресов, по которым
указаны размеры областей кэша? - Nikolay_Po(15.09.2022 17:19)
- что на счет uint32_t size = (uint32_t)&__CACHE_REGION_SIZE; - Constantin24(15.09.2022 15:44)
- Ну да, volatile точно победит, потому что компилятор считает, что
содержимое такого объекта может измениться в любой момент. Был не
ноль, а потом стал ноль: SciFi(116 знак., 15.09.2022 15:39)
- 1) Можете пояснить более подробно(или ссылку на чтение), никак не
могу понять ваше объяснение: почему адрес не может быть нулевым? Constantin24(166 знак., 15.09.2022 16:04)
- Похоже на баг, godbolt показывает похожую фигню в версиях gcc 9+, в
версии gcc 8 вроде бы нормально >>> SciFi(1 знак., 15.09.2022 14:46, ссылка)
- спасибо, куда писать в таких ситуациях? - Constantin24(15.09.2022 14:49)
- Если это GNU Arm Embedded Toolchain, то сюда >>> SciFi(1 знак., 15.09.2022 15:24, ссылка)
- спасибо, куда писать в таких ситуациях? - Constantin24(15.09.2022 14:49)
- Отбой, это не баг. Компилятор считает, что адрес не может быть
нулевым, потому что нулевой указатель не может указывать ни на
какой объект, в том числе __CACHE_REGION_SIZE. Вот такая фигня. - SciFi(15.09.2022 15:30)
- Вот Constantin24(1 знак., 15.09.2022 14:40, картинка)
- дополнил про __CACHE_REGION_SIZE - Constantin24(15.09.2022 15:44)