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

VladislavS

Свой
  • Постов

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

  • Посещение

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

    9

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


  1. 16 часов назад, Turgenev сказал:

    почему SPI или DMA не работают с DTCM памятью.

    Потому что так задумано. DTCM и ITCM только для ядра доступны без всяких шин быстро и сразу.

    Вообще, настройки линкера никак не влияют на работу периферийных устройст, а лишь размещают данные в памяти. Можете тупо указывать в функциях абсолютные адреса и ни один линкер это не изменит. Проверяйте включены и настроены ли все нужные области памяти и периферийные модули. Обратите внимение на настройки MPU - защита и кэширование  областей памяти могут мешать работе DMA.

  2. 27 минут назад, Quantum1 сказал:

    Это код в одно действие,

    Любая программа это последовательность операций "в одно действие". 

    28 минут назад, Quantum1 сказал:

    тут компилятор физически ничего другого сделать не может

    И это правильно, программа должна работать так как задумано.

    33 минуты назад, Quantum1 сказал:

    Потому что местные спецы толком не понимают, как даже этот самый volatile работает

    Хорошо что вы понимаете. Только почему-то это "понимание" не помогает правильные программы писать.

  3. 9 часов назад, Quantum1 сказал:

    Тебе критично важно что бы твой код выполнился ровно в тот момент времени, и ровно так как написано.

    Критерий "ровно в тот момент времени" огласите? С точностью до такта? На ARM с конвейером, предвыборками, разными шинами, DMA и кэшами это в принципе невозможно даже на ассемблере. "Ровно как написано" в смысле последовательности чтений/записей делается на С правильной расстановкой volatile вне зависимости от режимов компиляции/оптимизации.

  4. 6 часов назад, AlexRayne сказал:

    вот поэтому их надо перекладывать в другой объект

    А потом включаете LTO и...

    12 часов назад, Quantum1 сказал:

    И как мы видим, в моем случае, компилятор творит дичь именно на выражениях....

    Во-первых, мы этого не видим, код засекречен.

    Во-вторых, внимательно следим за руками. Вот тут компилятор выдаёт предупреждение:

    image.thumb.png.3ab72df724c6a9406b8ac97e4ed608dc.png

    Ну ок, объясним компилятору КАК мы хотим:

    image.png.b6c3766556f2bd7f0b0733fd616f55b8.png

    И он нас услышал

    //int main()
    //{
    main:
    //  int tmp_a = a;
            LDR.N    R2,??DataTable1_1
            LDR      R1,[R2, #+0]   
    //  int tmp_b = b;
            LDR      R0,[R2, #+4]
    //  c = tmp_a + tmp_b;
            ADDS     R1,R0,R1       
            STR      R1,[R2, #+8]   
    //  for(;;);
    ??main_0:
            B.N      ??main_0       
    //}
    
    ??DataTable1_1:
            DATA32
            DC32     a 

    Хотите наоборот? Легко.

    image.png.b390b038791232c007db848f07225629.png

    //int main()
    //{
    main:
    //  int tmp_b = b;
            LDR.N    R2,??DataTable1_1
            LDR      R0,[R2, #+4]   
    //  int tmp_a = a;
            LDR      R1,[R2, #+0]   
    //  c = tmp_a + tmp_b;
            ADDS     R0,R0,R1       
            STR      R0,[R2, #+8]   
    //  for(;;);
    ??main_0:
            B.N      ??main_0       
    //}

    Обращаем особое внимание, что компилятор оставил только операции с volatile сущностями, остальное для него было лишь пояснение что и как я хочу сделать.

    • Upvote 2
  5. 14 минут назад, Quantum1 сказал:

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

    Любая программа это и есть жесткая последовательность действий. Но если вы её компилируете оптимизирующим компилятором, то для него важны только функция main и все действия с volatile сущностями. Остальное он воспринимает как описание того что вы с ними хотите сделать. Если вы этого не понимаете, то получаете то что на вашей картинке.

     

    18 минут назад, Quantum1 сказал:

    Уж простите

    Да куда уж нам... 😄

    • Upvote 1
  6. 13 минут назад, Stepanov сказал:

    Чтобы  компилятор не сильно менял задуманный код

    Ещё раз. Компилятор не имеет права менять задуманный код, но для этого его надо правильно писать. 

    9 минут назад, Stepanov сказал:

    в таких случаях как у ТС

    Вы это как поняли, если код не предъявлен? В хрустальном шаре?

    • Upvote 1
  7. 5 минут назад, Stepanov сказал:

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

    Чтобы компилятор вообще не менял задуманный код - его надо правильно написать.

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

    • Upvote 1
  8. 1 час назад, Quantum1 сказал:

    Пишу свою специфическую библиотеку для работы с периферией.

    Для этого просто обязательно умение писать под оптимизирующий компилятор. Либо на асме. Третьего не дано.

    • Upvote 1
  9. А смысл его показывать, если компилятор всё равно виноват :))

    1 минуту назад, Quantum1 сказал:

    Мой вопрос совсем о другом. И он поставлен вполне конкретно.

    Ответ: Что в коде написали, то компилятор и сделал.

  10. Последовательность поменяна и номера не все. Думаете нам интересно в этом дерьме разбираться? А ошибка уже в первой же С-ной строке.

     

    PS: И далеко не всё что видно объявлено volatile. Это по генерируемому коду видно.

    • Upvote 1
  11. J-Link это всего лишь адаптер, он ничего сам не делает. Делает программа, которая с его помощью прошивает. Программ этих чуть больше чем дофига и каждая делает посвоему. Собственно и OpenOCD через J-link шить умеет.

  12. 3 часа назад, LAS9891 сказал:

    Скажите уже, что мне надо читать Страуструпа.

    Вообще-то, Кернигана и Ритчи 🙂  Это никому не повредит. Но что-то мне подсказывает, что там ни про работу с volatile сущностями, ни про оптимизирующий компилятор, ни про то как данные с задержками по шинам бегают, ни вообще про эмбэдд ни слова не будет. А до Страуструпа ещё надо дорасти.

  13.  

    17 минут назад, LAS9891 сказал:

    Как я ИХ мог очистить

    Между чтение для обработки и повторным чтением для очистки могло произойти что угодно.

    3 часа назад, LAS9891 сказал:

    Вам стоило написать в STM и рассказать им какие они там все говнокодеры

    Это Секрет Полишинеля. Впрочем, тот код что для них индусы пишут, ещё ничего. :)))

  14. 1 час назад, LAS9891 сказал:
    TIMER_INTF(TIMER1) &= (~TIMER_INTF_CH0IF);

    А потом у вас прерывания теряются. Тут вы очистили флаги, которые "вскочили" во время обработки текущего прерывания, не обработав.

    45 минут назад, LAS9891 сказал:

    Тут пишут, что флаг надо смотреть не прямо в регистре, а через переменную:

    Смотреть прямо в регистре периферии микроконтроллер не может. Он сначала считывает в регистр процессора, а затем смотрит. Локальная переменная будет расположена в регистре процессора. Не нужно много раз читать регистр статуса в регистр процессора, это напрасная трата времени в прерывании.

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