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

Тэги для принудительной последовательности компиляции С-кода

On 6/6/2024 at 7:25 PM, jcxz said:

Так в чём именно "не угадал"?

PS: Кстати - судя по листингу это может быть и Cortex-M. Cortex-M вполне может выполнять такие команды.

какие? mov, add да и b )))))))) так это любой арм выполнит.... хоть A72 ))))

On 6/6/2024 at 7:28 PM, jcxz said:

Сперва научитесь читать. Именно читать написанное. А не выумывать. Модель вашего проца я и не угадывал.

 

cortex-m это что?? архитектура??

ну у вас этого навыка не было 4 страницы )))) ну так разобрались с volatile? 

Изменено пользователем Quantum1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

16 minutes ago, jcxz said:

Причём тут DSP? Судя по листингу - у ТС обычный ARM в 32-битном режиме.

Смутил CodeComposerStudio и предложенное описание TI's optimizing C compiler for TMS32C28x. А в ассемблерный код я, признаться, и не всматривался (из зрительного зала это не особо нужно :-) ).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 hours ago, Quantum1 said:

Но компилятор тут слишком своевольничает, и довольно существенно меняет последовательность выполнения уже в скомпилированном asm. Т.е. может например загрузить в регистр, что то посчитанное на грубо говоря несколько С-строчек кода позднее, чем это написано. А это неприемлимо и все валит.
Я принципиально не хочу играться с настройками оптимизации комплилятора. Так как это та часть кода, которая обязана всегда выполняться одинаково, не важно что там мы оптимизируем.

Указывать компилятору когда загружать значение в регистр относительно строк исходного кода? Это некорректная постановка вопроса, компиляторы так не работают.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, Raven сказал:

Да, дайте же ему, наконец, ключи, которые отключат оптимизацию компиляции для кода

Дак в среде CCS наверняка в настройках есть optimization level пусть поставит none  да и все)))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 минуты назад, mantech сказал:

Дак в среде CCS наверняка в настройках есть optimization level пусть поставит none  да и все)))

Это ничего не гарантирует, да и корневая идея топика - троллинг)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 6/6/2024 at 9:06 PM, mantech said:

Дак в среде CCS наверняка в настройках есть optimization level пусть поставит none  да и все)))

в шапке топика написано черным по белому, русским языком, я хочу часть кода по сути отвязать от глобальных настроек компилятора. И это совершенно правильно.

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

Когда работаешь с процессами реального времени. Тебе критично важно что бы твой код выполнился ровно в тот момент времени, и ровно так как написано. В самых важных местах - переходишь на ассемблер. В менее критичных - добиваешься от компилятора желаемого.

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

On 6/6/2024 at 8:16 PM, amaora said:

Указывать компилятору когда загружать значение в регистр относительно строк исходного кода? Это некорректная постановка вопроса, компиляторы так не работают.

Да ладно... ок, а что делать то тогда? Как работает миллионы систем реального времени, не эти которые с RTOS лампочки там дома включают, а настоящие которые  поездами/самолетами рулят)

On 6/6/2024 at 9:10 PM, Arlleex said:

Это ничего не гарантирует, да и корневая идея топика - троллинг)

вы хоть раз делали хотя бы цифровой многоканальный источник питания? ну или управление каким нить прибором научным - лазерной системой например?

On 6/6/2024 at 7:15 PM, Stepanov said:

Del.

Да, надо уточнить какой именно МК и компилятор.

 

За холиваром пропустил сообщение))

Cortex R5F

TI ARM Assembler PC v20.2.6

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

вы хоть раз делали хотя бы цифровой многоканальный источник питания? ну или управление каким нить прибором научным - лазерной системой например?

Только лампочкой в цикле моргал. А что, сложно?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2TC: Вы уж, если не хотите светить свой целевой код, то хотя бы соорудите выжимку-пример (только полный, компилируемый), в котором будет задействован нужный вам вариант организации кода. И выложите для обсуждения и советов. Если у вас хватит выдержки довести процесс до конца и не разругаться с советчиками, думаю, вас удивит, как можно  было достичь желаемого уже заявленными средствами.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 часов назад, jcxz сказал:

То что они глобальные - не панацея. Ведь компилятор вправе делать все оптимизации, которые не нарушают логику программы, описанную алгоритмом. А выделение в отдельную функцию не меняет логику выполнения.

вот поэтому их надо перекладывать в другой объект, чтоб компилятор не мог заинлайнить. И по моей практике - не инлайнит он на АРМах, надо особенно его еще уговорить заинлайнить, особенно с ключом Os

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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 сущностями, остальное для него было лишь пояснение что и как я хочу сделать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я конечно понимаю, что вместо обозначеного вопроса данный топик ушёл в сторону обсуждения, какой автор "баран", но почему никто из специалистов ничего не сказал про asm volatile("" ::: "memory");? 

Изменено пользователем Anxigeros

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

13 минут назад, Anxigeros сказал:

Я конечно понимаю, что вместо обозначеного вопроса данный топик ушёл в сторону обсуждения, какой автор "баран", но почему никто из специалистов ничего не сказал про asm volatile("" ::: "memory");? 

Барьеры "не про это".

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

в шапке топика написано черным по белому, русским языком, я хочу часть кода по сути отвязать от глобальных настроек компилятора. И это совершенно правильно.

Это было написано ТОЛЬКО для проверки вашей гипотезы, что оптимизация может вносить изменения в результат, которые вам не подходят, если это уже было проверено, то извиняйте, не увидел...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

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