Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 13.08.2012
Сообщений: 6
1

Глюки Си компилятора Atmel Studio

08.12.2020, 06:05. Показов 600. Ответов 7

Давно занимаюсь написанием прог для AVR в Atmel Studio и постоянно сталкиваюсь с косяками компиляции, а точнее оптимизации данного компилятора. Но последний глюк из ряда вон выходящий. Судите сами: в дисассемблерном коде должно быть не BRLT PC-0x01, а BRLT PC-0x02
Из-за этого программа зацикливается в бесконечном цикле.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include "chargerProbe.h"
extern uint8_t workReg; 
void canSPIwrite(uint8_t data)
{
    workReg |= (1<<B_spiCAN);
    SPDR=data;
    while(workReg&(1<<B_spiCAN));
}
void canReset(void)
{
    PORTB &= ~(1<<CS_CAN);
    canSPIwrite(CAN_RESET);
    PORTB |= (1<<CS_CAN);
}
void mcpInit(void)
{
    //uint8_t temp;
    canReset();
    _delay_ms(1);
    
}
Код
--- E:\Work\TITAN\Program\ChargerProbe\Debug/.././function.c -------------------
    17: {
    18: 	workReg |= (1<<B_spiCAN);
 LDS R25,0x0100		Load direct from data space 
 ORI R25,0x80		Logical OR with immediate 
 STS 0x0100,R25		Store direct to data space 
    19: 	SPDR=data;
 OUT 0x2E,R24		Out to I/O location 
--- E:\Work\TITAN\Program\ChargerProbe\Debug/.././function.c -------------------
    20: 	while(workReg&(1<<B_spiCAN));
 LDS R24,0x0100		Load direct from data space 
--- No source file -------------------------------------------------------------
 TST R24		Test for Zero or Minus 
 BRLT PC-0x01		Branch if less than, signed 
--- E:\Work\TITAN\Program\ChargerProbe\Debug/.././function.c -------------------
    21: }
 RET 		Subroutine return 
    38: 	PORTB &= ~(1<<CS_CAN);
 CBI 0x05,2		Clear bit in I/O register 
    39: 	canSPIwrite(CAN_RESET);
 LDI R24,0xC0		Load immediate 
 CALL 0x0000005C		Call subroutine 
    40: 	PORTB |= (1<<CS_CAN);
 SBI 0x05,2		Set bit in I/O register 
 RET 		Subroutine return 
    66: 	canReset();
 CALL 0x00000067		Call subroutine
C
1
2
3
4
5
6
7
8
#include "chargerProbe.h"
 
extern uint8_t workReg;
 
ISR(SPI_STC_vect)
{
    workReg &= ~(1<<B_spiCAN);
}
Кто сталкивался с подобным?
исходный проект
0
Вложения
Тип файла: zip ChargerProbe.zip (41.1 Кб, 13 просмотров)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.12.2020, 06:05
Ответы с готовыми решениями:

Почему AVR Studio 4, а не Atmel Studio 6?
По какой причине большинство специалистов по AVR микроконтроллерам в основном используют AVR Studyo...

глюки опций компилятора
кто-нибудь поможет разобраться с &quot;опциями проекта&quot; в C++Builder !? (меню Project -&gt; Options) Не в...

Глюки МикроСи. Выявление, исправление (обход скользких мест) и личный опыт борьбы с аномалиями компилятора
Работаю с Пиками больше 20 лет. С 2013 года использую MicroC. Сталкивался с разными глюками, кстати...

Atmel Studio 6.0
Здравствуйте! Подскажите пожалуйста , не пойму почему при запуске программы компилятор выдает : ...

7
2857 / 1726 / 353
Регистрация: 09.09.2017
Сообщений: 7,273
08.12.2020, 08:18 2
Это участок, соответствующие 7 строке? Тогда все правильно - компилятор один раз считал переменную в регистр и проверяет ее в цикле. Вы же не предупредили что она может где-то еще измениться (volatile).
1
1 / 1 / 0
Регистрация: 28.03.2020
Сообщений: 13
08.12.2020, 11:05 3
5 и 6 строки надо "обнять" фигурными скобками и перед ними вставить do. Это показывает, что while относится к двум строкам, а не к одной 6.
0
0 / 0 / 0
Регистрация: 13.08.2012
Сообщений: 6
08.12.2020, 12:25  [ТС] 4
Да, соответствует 7 строке. Нет, не правильно. Посмотрите код ассеблера: один раз считал переменную и всё циклически не считывает её, не проверяет её значение. Переменная объявлена как volatile. Если интересно погоняйте код в симуляторе. Проект прилагается
0
2857 / 1726 / 353
Регистрация: 09.09.2017
Сообщений: 7,273
08.12.2020, 12:39 5
Цитата Сообщение от SunSay Посмотреть сообщение
extern uint8_t workReg;
Не вижу тут слова volatile. Оно должно быть при каждом объявлении, не только при первом.
1
0 / 0 / 0
Регистрация: 13.08.2012
Сообщений: 6
08.12.2020, 12:46  [ТС] 6
Спасибо. Дошло. Volatile надо прописывать не только в файле объявления переменной но и сдесь
C
1
2
3
4
5
6
7
8
extern volatile uint8_t workReg; 
 
void canSPIwrite(uint8_t data)
{
    workReg |= (1<<B_spiCAN);
    SPDR=data;
    while(workReg&(1<<B_spiCAN));
}
УРА!!!! ЗАРАБОТАЛА!!!!
0
124 / 93 / 18
Регистрация: 15.11.2012
Сообщений: 582
08.12.2020, 18:59 7
Цитата Сообщение от SunSay Посмотреть сообщение
Volatile надо прописывать не только в файле объявления переменной но и сдесь
Глюк скорее в том, что студия вообще это собрала. IAR в такой ситуации дает ошибку несогласованности типов (типа там volatile int a, а здесь просто int a, ну или наоборот).
0
Модератор
Эксперт по электронике
8380 / 6225 / 836
Регистрация: 14.02.2011
Сообщений: 21,608
09.12.2020, 01:49 8
Цитата Сообщение от alexey6689 Посмотреть сообщение
дает ошибку несогласованности типов (типа там volatile int a, а здесь просто int a, ну или наоборот).
утверждать не берусь, но по моему мнению, к типам строг С++, С более лояльный, даже предепреждения не всегда выдает не говоря о ошибках
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.12.2020, 01:49

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

Atmel studio 6.1
Здравствуйте. столкнулся с проблемой запуска программы. вылетает сообщение:debugging tool is not...

Atmel studio 6
Вопрос таков, есть некая библиотека, в lcd_lib.h прототипы, в lcd_lib.c сами функции, оба файла...

Atmel Studio
Подскажите где смотреть библиотеку Atmel Studio.

Atmel Studio
помогите написать программу работы светофора на языке Assembler

Платная ли Atmel Studio?
Переустановил систему, скачал AS с офф сайта. Запускаю инсталятор - выводит уведомление... Не...

Atmel Studio 6.1 прерывания
Здравствуйте! Недавно приступил к изучению Atmel Studyo 6.1! Пока пишу на Assemdlere.Возникла такая...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.