Quantum1 0 6 июня Опубликовано 6 июня (изменено) · Жалоба Всем привет! Детский вопрос, заранее извиняюсь, но из головы вылетело совершенно. Работаю в CodeComposerStudio с техаским МК, компилятор родной. Пишу свою специфическую библиотеку для работы с периферией. Взял некие математические куски от своих прошлых проектов (там и ASM-код и C и т.д.), и все раньше работало замечательно. А в этом проекте проблемы, и вот в чем: в C-коде помимо математики много работы с периферийными регистрами, где требуется четкое время обращения к ним, т.е. что то посчитали сразу загрузили/выгрузили в регистры. Но компилятор тут слишком своевольничает, и довольно существенно меняет последовательность выполнения уже в скомпилированном asm. Т.е. может например загрузить в регистр, что то посчитанное на грубо говоря несколько С-строчек кода позднее, чем это написано. А это неприемлимо и все валит. Я принципиально не хочу играться с настройками оптимизации комплилятора. Так как это та часть кода, которая обязана всегда выполняться одинаково, не важно что там мы оптимизируем. Много лет назад, я что то припоминаю из другого проекта, что в таких случаях вставлял такой код(критичный к последовательности исполнения), то ли между каких то pragma-тэгов, то ли attribute, но это давно было и его исходников мне сейчас уже не посмотреть. Нагулить никак не получается. Напомните/подскажите пожалуйста) заранее огромное спасибо. Изменено 6 июня пользователем Quantum1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 234 6 июня Опубликовано 6 июня · Жалоба 4 минуты назад, Quantum1 сказал: Но компилятор тут слишком своевольничает, и довольно существенно меняет последовательность выполнения уже в скомпилированном asm. Т.е. может например загрузить в регистр, что то посчитанное на грубо говоря несколько С-строчек кода позднее, чем это написано. А это неприемлимо и все валит. "Периферийные регистры" объявлены с volatile? Если нет, то компилятор тут явно не при чём... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Quantum1 0 6 июня Опубликовано 6 июня (изменено) · Жалоба On 6/6/2024 at 2:20 PM, jcxz said: "Периферийные регистры" объявлены с volatile? и так и так, есть и с volatile, есть и без - разницы не увидел Изменено 6 июня пользователем Quantum1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 234 6 июня Опубликовано 6 июня · Жалоба 1 минуту назад, Quantum1 сказал: нет, это структуры, по define начальному адресу Тогда виноватых нужно искать явно не в компиляторе, а где-то между стулом и клавиатурой. PS: Странно не знать таких базовых вещей человеку, который вроде как уже много лет пишет код для МК.... 7 минут назад, Quantum1 сказал: Много лет назад, я что то припоминаю из другого проекта, что в таких случаях вставлял такой код Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Quantum1 0 6 июня Опубликовано 6 июня (изменено) · Жалоба On 6/6/2024 at 2:25 PM, jcxz said: Тогда виноватых нужно искать явно не в компиляторе, а где-то между стулом и клавиатурой. PS: Странно не знать таких базовых вещей человеку, который вроде как уже много лет пишет код для МК.... описался. Ответ исправил, а вы сразу на личности... че ж народ тут такой злой... Изменено 6 июня пользователем Quantum1 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 234 6 июня Опубликовано 6 июня · Жалоба 5 минут назад, Quantum1 сказал: описался. Ответ исправил, а вы сразу на личности.... Причём тут какие-то личности? 10 минут назад, Quantum1 сказал: и так и так, есть и с volatile, есть и без - разницы не увидел "И так и так" быть не должно. Должно быть с volatile обязательно. Но вы похоже не понимаете почему... Что-то очень сомнительно, чтобы проблема была в компиляторе. Показывайте код и листинг. Со всеми определениями естественно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Quantum1 0 6 июня Опубликовано 6 июня · Жалоба один из примеров Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 234 6 июня Опубликовано 6 июня · Жалоба 16 минут назад, Quantum1 сказал: один из примеров вижу баг уже в 1-й строке. PS: Выкладывайте текстом. Никто тут не захочет перепечатывать это с экрана. PPS: Также (судя по листингу) - volatile при определении регистров периферии отсутствуют. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Quantum1 0 6 июня Опубликовано 6 июня (изменено) · Жалоба если про асм там их много я вам текстом не смогу отметить)))) 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 Изменено 6 июня пользователем Quantum1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 39 6 июня Опубликовано 6 июня · Жалоба Исходный код до компиляции без всяких асмов есть? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 49 6 июня Опубликовано 6 июня · Жалоба 2 минуты назад, VladislavS сказал: Исходный код до компиляции Он между строчек))))))) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 234 6 июня Опубликовано 6 июня · Жалоба 15 минут назад, Quantum1 сказал: я вам текстом не смогу отметить)))) Вот от этого: while((etpwmREG2->TBSTS)& 0x0002 == 0); Вы чего ожидаете? Компилятор должен просто выкинуть такую строку (особенно - при отсутствии volatile). Читайте про приоритеты операций в си. Баги почти в каждой строке работы с периферией... мрак... PS: Для вставки кода здесь (в редакторе форума) есть спец.тэг. Обратите внимание как у меня вставлен код. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 39 6 июня Опубликовано 6 июня · Жалоба Последовательность поменяна и номера не все. Думаете нам интересно в этом дерьме разбираться? А ошибка уже в первой же С-ной строке. PS: И далеко не всё что видно объявлено volatile. Это по генерируемому коду видно. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Quantum1 0 6 июня Опубликовано 6 июня · Жалоба On 6/6/2024 at 3:17 PM, jcxz said: Вот от этого: while((etpwmREG2->TBSTS)& 0x0002 == 0); Вы чего ожидаете? Баги почти в каждой строке работы с периферией... мрак... PS: Для вставки кода здесь (в редакторе форума) есть спец.тэг. Обратите внимание как у меня вставлен код. согласен, скобки забыты. Но к проблеме это не относится) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 234 6 июня Опубликовано 6 июня · Жалоба 1 минуту назад, Quantum1 сказал: согласен, скобки забыты. Но к проблеме это не относится) Скобки забыты и volatile забыт. А так да - ничего. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться