-
Постов
1 239 -
Зарегистрирован
-
Посещение
-
Победитель дней
9
Сообщения, опубликованные VladislavS
-
-
16 часов назад, Turgenev сказал:
почему SPI или DMA не работают с DTCM памятью.
Потому что так задумано. DTCM и ITCM только для ядра доступны без всяких шин быстро и сразу.
Вообще, настройки линкера никак не влияют на работу периферийных устройст, а лишь размещают данные в памяти. Можете тупо указывать в функциях абсолютные адреса и ни один линкер это не изменит. Проверяйте включены и настроены ли все нужные области памяти и периферийные модули. Обратите внимение на настройки MPU - защита и кэширование областей памяти могут мешать работе DMA.
-
1 час назад, Quantum1 сказал:
При чем тут С++??
Действительно, при чём тут С++? Обычный С-код.
-
27 минут назад, Quantum1 сказал:
Это код в одно действие,
Любая программа это последовательность операций "в одно действие".
28 минут назад, Quantum1 сказал:тут компилятор физически ничего другого сделать не может
И это правильно, программа должна работать так как задумано.
33 минуты назад, Quantum1 сказал:Потому что местные спецы толком не понимают, как даже этот самый volatile работает
Хорошо что вы понимаете. Только почему-то это "понимание" не помогает правильные программы писать.
-
Ну вы сказали, и что изменилось?
-
9 часов назад, Quantum1 сказал:
Тебе критично важно что бы твой код выполнился ровно в тот момент времени, и ровно так как написано.
Критерий "ровно в тот момент времени" огласите? С точностью до такта? На ARM с конвейером, предвыборками, разными шинами, DMA и кэшами это в принципе невозможно даже на ассемблере. "Ровно как написано" в смысле последовательности чтений/записей делается на С правильной расстановкой volatile вне зависимости от режимов компиляции/оптимизации.
-
6 часов назад, AlexRayne сказал:
вот поэтому их надо перекладывать в другой объект
А потом включаете LTO и...
12 часов назад, Quantum1 сказал:И как мы видим, в моем случае, компилятор творит дичь именно на выражениях....
Во-первых, мы этого не видим, код засекречен.
Во-вторых, внимательно следим за руками. Вот тут компилятор выдаёт предупреждение:
Ну ок, объясним компилятору КАК мы хотим:
И он нас услышал
//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
Хотите наоборот? Легко.
//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 сущностями, остальное для него было лишь пояснение что и как я хочу сделать.
- 2
-
14 минут назад, Quantum1 сказал:
Мне просто казалось, что в самом C есть стандартные методы для указания условно любому компилятору, про жесткую последовательность действий, без попыток оптимизации.
Любая программа это и есть жесткая последовательность действий. Но если вы её компилируете оптимизирующим компилятором, то для него важны только функция main и все действия с volatile сущностями. Остальное он воспринимает как описание того что вы с ними хотите сделать. Если вы этого не понимаете, то получаете то что на вашей картинке.
18 минут назад, Quantum1 сказал:Уж простите
Да куда уж нам... 😄
- 1
-
13 минут назад, Stepanov сказал:
Чтобы компилятор не сильно менял задуманный код
Ещё раз. Компилятор не имеет права менять задуманный код, но для этого его надо правильно писать.
9 минут назад, Stepanov сказал:в таких случаях как у ТС
Вы это как поняли, если код не предъявлен? В хрустальном шаре?
- 1
-
5 минут назад, Stepanov сказал:
Чтобы компилятор не сильно менял задуманный код, оптимизацию надо, локально, выключить.
Чтобы компилятор вообще не менял задуманный код - его надо правильно написать.
Если возникли желание/потребность отключить опитимизацию на участке кода, то вы явно что-то делаете не так.
- 1
-
1 час назад, Quantum1 сказал:
Пишу свою специфическую библиотеку для работы с периферией.
Для этого просто обязательно умение писать под оптимизирующий компилятор. Либо на асме. Третьего не дано.
- 1
-
А смысл его показывать, если компилятор всё равно виноват :))
1 минуту назад, Quantum1 сказал:Мой вопрос совсем о другом. И он поставлен вполне конкретно.
Ответ: Что в коде написали, то компилятор и сделал.
-
Последовательность поменяна и номера не все. Думаете нам интересно в этом дерьме разбираться? А ошибка уже в первой же С-ной строке.
PS: И далеко не всё что видно объявлено volatile. Это по генерируемому коду видно.
- 1
-
Исходный код до компиляции без всяких асмов есть?
-
Это чтобы успеть лишний раз подумать а надо ли оно мне :)))
-
Что-то не очень похоже на STM32. Какой-то клон?
-
+1. Что 150 мкс, что 150 мс - суть одно и то же. При внутрисхемной прошивке вообще секунды контроллер в ауте. Схемотехника должна это предусматривать.
-
А где отладка то? Регистры процессора и периферии, дизасм?
-
Чисто в педагогических целях стоит решить задачу самому.
-
J-Link это всего лишь адаптер, он ничего сам не делает. Делает программа, которая с его помощью прошивает. Программ этих чуть больше чем дофига и каждая делает посвоему. Собственно и OpenOCD через J-link шить умеет.
-
На время отладки все остальные прерывания отключить, колбэки убрать. Добиться отсутствия пропусков и понемногу возвращать функционал.
-
3 часа назад, LAS9891 сказал:
Скажите уже, что мне надо читать Страуструпа.
Вообще-то, Кернигана и Ритчи 🙂 Это никому не повредит. Но что-то мне подсказывает, что там ни про работу с volatile сущностями, ни про оптимизирующий компилятор, ни про то как данные с задержками по шинам бегают, ни вообще про эмбэдд ни слова не будет. А до Страуструпа ещё надо дорасти.
-
-
17 минут назад, LAS9891 сказал:
Как я ИХ мог очистить
Между чтение для обработки и повторным чтением для очистки могло произойти что угодно.
3 часа назад, LAS9891 сказал:Вам стоило написать в STM и рассказать им какие они там все говнокодеры
Это Секрет Полишинеля. Впрочем, тот код что для них индусы пишут, ещё ничего. :)))
-
1 час назад, LAS9891 сказал:
TIMER_INTF(TIMER1) &= (~TIMER_INTF_CH0IF);
А потом у вас прерывания теряются. Тут вы очистили флаги, которые "вскочили" во время обработки текущего прерывания, не обработав.
45 минут назад, LAS9891 сказал:Тут пишут, что флаг надо смотреть не прямо в регистре, а через переменную:
Смотреть прямо в регистре периферии микроконтроллер не может. Он сначала считывает в регистр процессора, а затем смотрит. Локальная переменная будет расположена в регистре процессора. Не нужно много раз читать регистр статуса в регистр процессора, это напрасная трата времени в прерывании.
Тэги для принудительной последовательности компиляции С-кода
в ARM
Опубликовано · Пожаловаться
Перечитал тему ещё раз. Да нет же, у ТС компилятор хрень делает, а не у меня. Хорошо что именно я ничего не понимаю в компиляторах. :)))