Перейти к содержанию
    

VladislavS

Свой
  • Постов

    1 240
  • Зарегистрирован

  • Посещение

  • Победитель дней

    9

Сообщения, опубликованные VladislavS


  1. 26 минут назад, jcxz сказал:

    Только в случае с res16 = (int)(x * 8) + B15 получается куча лишних команд. По идее сама команда VCVT.S16.F32 уже должна бОльшую часть всех нужных операций сделать:

    Как это? Все операции справа от равно должны в 32-битах выполниться, а лишь затем до 16 обрезаться. Именно так gcc и сделал.

  2. Если проследить все неявные преобразования, то получается как-то так 

    res32 = (unsigned int)(int)(eeg[i] * 16.0f) + 0x00008000ul;

    Как по стандарту положено делать последовательное float -> int -> unsigned int на ночь глядя не берусь сказать.

  3. ИМХО, если хочется выполнять рабочий код из SRAM, то самое правильное будет:

    - скомпилировать рабочую прошивку с тех адресов, где она штатно будет работать. Так и отлаживать проще.

    - прошить её во Flash с некоторым смещением, чтобы вначале поместился начальный загрузчик.

    - Написать начальный загрузчик, который копирует прошивку из flash в SRAM, делает remap и передаёт ей управление.

     

    Можно, конечно, чтобы загрузчик был частью основной прошивки, но надо ли? Всё равно, при удалённом обновлении неубиваемый загрузчик лучше иметь.

  4. aaarrr, я не являюсь автором ни одного компилятора, ни одной IDE. Зато я пользуюсь разными и мне нет смысла безосновательно "топить" за какую-то из них. Если редактор кода в IAR УГ, то я так и пишу. Зато отладка и анализ кода в том числе по листингам лучше.

    2 часа назад, aaarrr сказал:

    один адрес посмотреть

    И что вам это без содержимого регистров даёт? Полюбому отладчик расчехлять. Использовать листинги для отладки так себе идея.

  5. Ничего я не обрезал!  IAR генерит .s и .lst - у них разное содержимое. Смотря что вам надо. Для изучения что там наделал компилятор удобнее первое. Для поиска ошибок, нет, не второе, а действительно отладчик, раз уже до  HF дошло.

  6. 2 минуты назад, aaarrr сказал:

    По картинке этого не скажешь.

    Я же говорю, с адресами не вопрос.

    ЗЫ: Надеюсь, ТС увидел, пока мы тут пиписьками листингами меряемся, куда его 10 тактов делись?

  7. 18 минут назад, aaarrr сказал:

    Вот случился, положим, HF по адресу 8000ac0 - где его искать?

    Я уже уехал от компа, но поверьте, посмотреть что по адресу 8000ac0 никаких проблем не вызывает. Точно так же код с адресами получить не вопрос. А вот как objdump вставляет исходный код в листинг, да ещё из релизной сборки без отладочной информации, можете показать.

  8. ?

     

    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

     

  9. 3 минуты назад, aaarrr сказал:

    Ну а где в этом цикле что-то похожее на работу с регистрами?

    __IO uint32_t nCount
    1 минуту назад, AlexKai сказал:

    полагаю по хорошему перед циклом переменная должна копироваться в регистр и цикл уже работать с регистром

    Уберите __IO, так и будет. Только тогда пустой цикл без __NOP() оптимизатор выкинет к чертям собачим.

  10. 1 минуту назад, aaarrr сказал:

    GCC, например, такой ерундой не занимается.

    Интересно, а как же он на __IO реагирует? Если бы это было так, то работа с регистрами периферии на С была бы невозможна.

  11. 47 минут назад, AlexKai сказал:

    __IO uint32_t nCount

    Это значит, что при каждом обращении к nCount она читается из памяти, над ней совершаются операции и она пишется в память. То есть, на один цикл она (читается из SRAM в РОН, декрементируется в РОН, записывается в SRAM, читается из SRAM, сравнивается с нулём). 10 тактов как нефиг делать.

     

    Вот так будет значительно быстрее. С включенной оптимизацией, само собой.

    void Delay(uint32_t nCount)
    {
    	while(nCount--) __NOP();
    }

     

  12. И что? Чем они от остальных обработчиков принципиально отличаются? Да пусть хоть на Rust будут. Что это меняет? Линкер в любом случае подставит туда их адреса. 

     

    У IAR стартап для Cortex-M ничего кроме формирования таблицы векторов прерывания не делает. Весь инициализационный код есть в прилинкованой библиотеке. На неё вектор ресета и перенаправлен. В ней же есть вызов функции low_level_init, которую можно вместо CMSIS-овской SystemInit использовать. Обработчики прерываний это уже юзеркод, который на чём хочешь/умеешь на том и пиши.

×
×
  • Создать...