-
Постов
1 240 -
Зарегистрирован
-
Посещение
-
Победитель дней
9
Сообщения, опубликованные VladislavS
-
-
Забил пример в Compiler Explorer. GCC как vcvt.s32.f32 в обоих случаях делает.
Чутка упростил и осовременил код
-
Если проследить все неявные преобразования, то получается как-то так
res32 = (unsigned int)(int)(eeg[i] * 16.0f) + 0x00008000ul;
Как по стандарту положено делать последовательное float -> int -> unsigned int на ночь глядя не берусь сказать.
-
Я думаю компилятор видит тут беззнаковое сложение. К нему и приводит. Если вот так?
res32 = (int)(eeg[i]*16) + (int)B15;
-
Я одно русское крылатое изречение знаю: "Кто к нам с чем придёт, тот от того и погибнет".
-
Не обижусь, если ткнёте носом.
-
Интересно было бы посмотреть.
-
ИМХО, если хочется выполнять рабочий код из SRAM, то самое правильное будет:
- скомпилировать рабочую прошивку с тех адресов, где она штатно будет работать. Так и отлаживать проще.
- прошить её во Flash с некоторым смещением, чтобы вначале поместился начальный загрузчик.
- Написать начальный загрузчик, который копирует прошивку из flash в SRAM, делает remap и передаёт ей управление.
Можно, конечно, чтобы загрузчик был частью основной прошивки, но надо ли? Всё равно, при удалённом обновлении неубиваемый загрузчик лучше иметь.
-
4 минуты назад, aaarrr сказал:
Содержимое регистров выдает обработчик HF.
Куда выдаёт? Держать под это дело UART?
-
aaarrr, я не являюсь автором ни одного компилятора, ни одной IDE. Зато я пользуюсь разными и мне нет смысла безосновательно "топить" за какую-то из них. Если редактор кода в IAR УГ, то я так и пишу. Зато отладка и анализ кода в том числе по листингам лучше.
2 часа назад, aaarrr сказал:один адрес посмотреть
И что вам это без содержимого регистров даёт? Полюбому отладчик расчехлять. Использовать листинги для отладки так себе идея.
-
Ничего я не обрезал! IAR генерит .s и .lst - у них разное содержимое. Смотря что вам надо. Для изучения что там наделал компилятор удобнее первое. Для поиска ошибок, нет, не второе, а действительно отладчик, раз уже до HF дошло.
-
2 минуты назад, aaarrr сказал:
По картинке этого не скажешь.
Я же говорю, с адресами не вопрос.
ЗЫ: Надеюсь, ТС увидел, пока мы тут
пиписькамилистингами меряемся, куда его 10 тактов делись? -
18 минут назад, aaarrr сказал:
Вот случился, положим, HF по адресу 8000ac0 - где его искать?
Я уже уехал от компа, но поверьте, посмотреть что по адресу 8000ac0 никаких проблем не вызывает. Точно так же код с адресами получить не вопрос. А вот как objdump вставляет исходный код в листинг, да ещё из релизной сборки без отладочной информации, можете показать.
-
-
GCC не умеет генерировать листинги, как вы в IAR привыкли. Более менее что-то видно только под отладкой.
-
-
?
GCC. Оптимизация 0s
5: void Delay(__IO uint32_t nCount) 6: { 0x200003e8 82 B0 sub sp, #8 0x200003ea 01 90 str r0, [sp, #4] 7: while(nCount--); 0x200003ec 01 9B ldr r3, [sp, #4] 0x200003ee 5A 1E subs r2, r3, #1 0x200003f0 01 92 str r2, [sp, #4] 0x200003f2 00 2B cmp r3, #0 0x200003f4 FA D1 bne.n 0x200003ec <Delay(unsigned long)+4> 0x200003f6 02 B0 add sp, #8 0x200003f8 70 47 bx lr
-
aaarrr, посмотрите как определены регистры периферии в заголовочном файле микроконтроллера и не спорьте.
А ещё лучше посмотрите листинг.
-
3 минуты назад, aaarrr сказал:
Ну а где в этом цикле что-то похожее на работу с регистрами?
__IO uint32_t nCount
1 минуту назад, AlexKai сказал:полагаю по хорошему перед циклом переменная должна копироваться в регистр и цикл уже работать с регистром
Уберите __IO, так и будет. Только тогда пустой цикл без __NOP() оптимизатор выкинет к чертям собачим.
-
1 минуту назад, aaarrr сказал:
GCC, например, такой ерундой не занимается.
Интересно, а как же он на __IO реагирует? Если бы это было так, то работа с регистрами периферии на С была бы невозможна.
-
47 минут назад, AlexKai сказал:
__IO uint32_t nCount
Это значит, что при каждом обращении к nCount она читается из памяти, над ней совершаются операции и она пишется в память. То есть, на один цикл она (читается из SRAM в РОН, декрементируется в РОН, записывается в SRAM, читается из SRAM, сравнивается с нулём). 10 тактов как нефиг делать.
Вот так будет значительно быстрее. С включенной оптимизацией, само собой.
void Delay(uint32_t nCount) { while(nCount--) __NOP(); }
-
Прошивка кода осуществляется с помощью FlashLoader. Для его работы (или он сам) включается HSI. Надо поискать опцию, чтобы reset жмакался после прошивки.
-
На самом простом Zynq можно чёрта лысого обсчитать.
-
А как же Milandr?
-
И что? Чем они от остальных обработчиков принципиально отличаются? Да пусть хоть на Rust будут. Что это меняет? Линкер в любом случае подставит туда их адреса.
У IAR стартап для Cortex-M ничего кроме формирования таблицы векторов прерывания не делает. Весь инициализационный код есть в прилинкованой библиотеке. На неё вектор ресета и перенаправлен. В ней же есть вызов функции low_level_init, которую можно вместо CMSIS-овской SystemInit использовать. Обработчики прерываний это уже юзеркод, который на чём хочешь/умеешь на том и пиши.
Баг IAR 7.80.4 (ARM) при работе с float.
в IAR
Опубликовано · Пожаловаться
Как это? Все операции справа от равно должны в 32-битах выполниться, а лишь затем до 16 обрезаться. Именно так gcc и сделал.