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

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

Всем привет!

Детский вопрос, заранее извиняюсь, но из головы вылетело совершенно.
Работаю в CodeComposerStudio с техаским МК, компилятор родной.
Пишу свою специфическую библиотеку для работы с периферией. Взял некие математические куски от своих прошлых проектов (там и ASM-код и C и т.д.), и все раньше работало замечательно. А в этом проекте проблемы, и вот в чем: в C-коде помимо математики много работы с периферийными регистрами, где требуется четкое время обращения к ним, т.е. что то посчитали сразу загрузили/выгрузили в регистры. Но компилятор тут слишком своевольничает, и довольно существенно меняет последовательность выполнения уже в скомпилированном asm. Т.е. может например загрузить в регистр, что то посчитанное на грубо говоря несколько С-строчек кода позднее, чем это написано. А это неприемлимо и все валит.
Я принципиально не хочу играться с настройками оптимизации комплилятора. Так как это та часть кода, которая обязана всегда выполняться одинаково, не важно что там мы оптимизируем.
Много лет назад, я что то припоминаю из другого проекта, что в таких случаях вставлял такой код(критичный к последовательности исполнения), то ли между каких то pragma-тэгов, то ли attribute, но это давно было и его исходников мне сейчас уже не посмотреть. Нагулить никак не получается.

Напомните/подскажите пожалуйста)

заранее огромное спасибо.

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

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


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

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

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

"Периферийные регистры" объявлены с volatile?

Если нет, то компилятор тут явно не при чём...

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


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

On 6/6/2024 at 2:20 PM, jcxz said:

"Периферийные регистры" объявлены с volatile?

и так и так, есть и с volatile, есть  и без - разницы не увидел

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

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


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

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

нет, это структуры, по define начальному адресу

Тогда виноватых нужно искать явно не в компиляторе, а где-то между стулом и клавиатурой.

 

PS: Странно не знать таких базовых вещей человеку, который вроде как уже много лет пишет код для МК....  :scratch_one-s_head:

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

Много лет назад, я что то припоминаю из другого проекта, что в таких случаях вставлял такой код

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


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

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

Тогда виноватых нужно искать явно не в компиляторе, а где-то между стулом и клавиатурой.

 

PS: Странно не знать таких базовых вещей человеку, который вроде как уже много лет пишет код для МК....  :scratch_one-s_head:

описался. Ответ исправил, а вы сразу на личности... че ж народ тут такой злой...

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

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


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

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

описался. Ответ исправил, а вы сразу на личности....

Причём тут какие-то личности?

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

и так и так, есть и с volatile, есть  и без - разницы не увидел

"И так и так" быть не должно. Должно быть с volatile обязательно. Но вы похоже не понимаете почему...

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

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


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

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

один из примеров 

image.png

вижу баг уже в 1-й строке.

 

PS: Выкладывайте текстом. Никто тут не захочет перепечатывать это с экрана.

PPS: Также (судя по листингу) - volatile при определении регистров периферии отсутствуют.

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


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

если про асм там их много

 

я вам текстом не смогу отметить))))

 

 

0000a0b0:   E1C1E0B2            strh       r14, [r1, #2]
402           while((etpwmREG2->TBSTS)& 0x0002 == 0);  
0000a0b4:   E1D1E0B2            ldrh       r14, [r1, #2]
404           temp_CAPFRC = rtiREG1->CNT[0].CAFRCx;
0000a0b8:   E595EC20            ldr        r14, [r5, #0xc20]
405           temp_CAPUC  = rtiREG1->CNT[0].CAUCx;
0000a0bc:   E5956C24            ldr        r6, [r5, #0xc24]
408           if(a==2){goto Marker_next1;}; //  куски отладки
0000a0c0:   0AFFFFF2            beq        $C$L2
422           while((etpwmREG2->TBSTS)& 0x0002 == 0);  
0000a0c4:   E1D170B2            ldrh       r7, [r1, #2]
0000a0c8:   E304ADF8            movw       r10, #0x4df8
423           etpwmREG2->TBSTS |= 0x0002;                
0000a0cc:   E1D170B2            ldrh       r7, [r1, #2]
0000a0d0:   E340A801            movt       r10, #0x801
0000a0d4:   E3049DF4            movw       r9, #0x4df4
406           temp_160Mhz_CAP = 1040 - ((temp_CAPFRC<<1U)+temp_CAPUC)*2;
0000a0d8:   E086808E            add        r8, r6, r14, lsl #1
423           etpwmREG2->TBSTS |= 0x0002;                 
0000a0dc:   E3877002            orr        r7, r7, #2
0000a0e0:   E1C170B2            strh       r7, [r1, #2]
0000a0e4:   E3409801            movt       r9, #0x801
424           while((etpwmREG2->TBSTS)& 0x0002 == 0);  
0000a0e8:   E1D170B2            ldrh       r7, [r1, #2]
425           etpwmREG2->TBSTS |= 0x0002;            
0000a0ec:   E1D170B2            ldrh       r7, [r1, #2]
0000a0f0:   E58A6000            str        r6, [r10]
0000a0f4:   E304ADF0            movw       r10, #0x4df0
0000a0f8:   E589E000            str        r14, [r9]
0000a0fc:   E3877002            orr        r7, r7, #2
0000a100:   E1C170B2            strh       r7, [r1, #2]
0000a104:   E340A801            movt       r10, #0x801
426           while((etpwmREG2->TBSTS)& 0x0002 == 0);
0000a108:   E1D160B2            ldrh       r6, [r1, #2]
406           temp_160Mhz_CAP = 1040 - ((temp_CAPFRC<<1U)+temp_CAPUC)*2;
0000a10c:   E1A07088            lsl        r7, r8, #1
0000a110:   E267EE41            rsb        r14, r7, #0x410
428           if(temp_160Mhz_CAP>520){        
0000a114:   E35E0F82            cmp        r14, #0x208
0000a118:   E58AE000            str        r14, [r10]
0000a11c:   8A000007            bhi        $C$L3

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

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


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

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

Исходный код до компиляции

Он между строчек)))))))

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


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

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

я вам текстом не смогу отметить))))

Вот от этого:

while((etpwmREG2->TBSTS)& 0x0002 == 0); 

Вы чего ожидаете? :wacko2:

Компилятор должен просто выкинуть такую строку (особенно - при отсутствии volatile).

Читайте про приоритеты операций в си.

Баги почти в каждой строке работы с периферией... мрак... :wacko:

 

PS: Для вставки кода здесь (в редакторе форума) есть спец.тэг. Обратите внимание как у меня вставлен код.

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


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

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

 

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

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


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

On 6/6/2024 at 3:17 PM, jcxz said:

Вот от этого:

while((etpwmREG2->TBSTS)& 0x0002 == 0); 

Вы чего ожидаете? :wacko2:

Баги почти в каждой строке работы с периферией... мрак... :wacko:

 

PS: Для вставки кода здесь (в редакторе форума) есть спец.тэг. Обратите внимание как у меня вставлен код.

согласен, скобки забыты. Но к проблеме это не относится)

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


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

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

согласен, скобки забыты. Но к проблеме это не относится)

Скобки забыты и volatile забыт. А так да - ничего.  :biggrin:

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


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

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

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

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

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

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

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

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

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

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