Страница 153 из 386
Re: Вопросы по С/С++ (СИ)
Добавлено: Чт май 16, 2013 09:53:24
Kavka
ibiza11, я же написал, что
могут быть проблемы.
shads, сейчас проверил на avr-gcc 4.3.3 варианты
__attribute__ ((used)) volatile register uint8_t varr asm("r5");
((used)) volatile register uint8_t varr asm("r5");
В обоих случаях компилятор не использует указанный регистр. Да же если "вычищены" операции с этим регистром (не имеющие смысла по "мнению" компилятора).
Т.е. регистр, похоже, реально зарезервирован. В дизассемблерном файле просто
нет никакого упоминания этого регистра.
Проверял так. Брал прогу, компилил, смотрел дизассемблер, выбирал какой-либо используемый регистр, резервировал регистр, компилил, смотрел дизассемблер.
А собранные библиотеки вы используете? А они скомпилированы с резервированием этого регистра.

Re: Вопросы по С/С++ (СИ)
Добавлено: Чт май 16, 2013 10:04:56
shads
Kavka писал(а):Т.е. регистр, похоже, реально зарезервирован. В дизассемблерном файле просто нет никакого упоминания этого регистра.
Может он и зарезервирован... надо будет еще раз поэксперементировать в моем случае.
Но почему он не инициализируется значением.... которое я явно загружаю в регистровую переменную...
Т.е. можно заключить, что он все таки резервирует регистр, но из за того что не видит его использования, опускает инициализацию... тогда зачем он его резервирует?....
Kavka писал(а):А собранные библиотеки вы используете? А они скомпилированы с резервированием этого регистра.

Имеете ввиду сторонние библиотеки? Не я использую только 2 свои файла, сишный и асмовый, без посторонних включений.
Re: Вопросы по С/С++ (СИ)
Добавлено: Чт май 16, 2013 11:08:05
Kavka
shads писал(а):И еще один момент.. по идее в ассемблерном файле я должен видеть сишные переменные, объявляя их напрмер так: .extern Div5
А НЕВИЖУ.....
Первое. Оно ж всё что не локальное и не static, всё, по умолчанию, extern.
Второе. Чем смотрите? Сделайте obj-шник файлика где реально определяется переменная и натравите на него nm (avr-nm) он вам даст перечень меток. Если там есть, то что-то не так в другом месте.
Моё предположение следующее - метку прерывания вы объявили:
.global TIM0_COMPA_vect
а Div5 (из цитаты выше) кто объявлять будет?

.global Div5
shads писал(а):Т.е. можно заключить, что он все таки резервирует регистр, но из за того что не видит его использования, опускает инициализацию...
Ага, именно так.
shads писал(а):тогда зачем он его резервирует?....
Ну, выже его попросили
Ну, в конце концов, сделайте вот так.
Спойлер
Код: Выделить всё
#include <avr/io.h>
#include <stdint.h>
// Reserved register
#define RR_NAME "r7"
#define RR_INITIAL_VALUE "100"
volatile register uint8_t var asm( RR_NAME );
int main (void)
{
asm volatile(
"ldi r24, " RR_INITIAL_VALUE " \n\t"
"mov %0, r24 \n\t"
:"=r"(var)::"r24"
);
// var = 100;
while(1){
}
}
Ставим плюсы 
Re: Вопросы по С/С++ (СИ)
Добавлено: Чт май 16, 2013 11:48:08
shads
Kavka писал(а):Моё предположение следующее - метку прерывания вы объявили:
.global TIM0_COMPA_vect
а Div5 (из цитаты выше) кто объявлять будет?

.global Div5
Да не, там функции и переменные чуть по разному оформляются..
http://www.atmel.com/Images/doc42055.pdf
Функции так:
Function visibility
A C language function needs to be declared as external in the assembly code in order to be “seen” by the assembler:
.extern my_C_function
An assembly language routine needs to be declared as global in the assembly code in order to be visible to the C
compiler. This is done using the using the “.global” directive:
.global my_assembly_fct
In addition, a C file that intends to call the assembly language routine will need to have a function prototype declaring
the assembly language routine to be external:
extern unsigned char my_assembly_fct (unsigned char, unsigned int);
а переменные так:
Variables
Both the C code and the assembly code can access variables independently. As a practical matter it is advisable to let
the C code manage the variables and pass parameters to the assembly code either by value or by reference. The
Chapters 5 Register usage and 6 Parameter passing describes how the registers sets are used by the C compiler and
how parameters are passed.
It is possible for both assembly and C to access the same global variable. Such a variable would need to be a global
variable in the C code and declared as external in the assembly code. Consider a variable “my_value” intended to be
global. In the C code it would be declared, outside of any function, like any other variable:
unsigned char my_value;
In the assembly it would be coded:
.extern my_value
Kavka писал(а):Ну, в конце концов, сделайте вот так.....
Да в принципе я могу по нормальному еще одну функцию кинуть в ассемблерный файл, функцию инициализации регистровых переменных, я просто переживал что си не резервирует их.... ну а раз он их все таки резервирует, то тут уже вариантов куча, как их проинитить.....
Re: Вопросы по С/С++ (СИ)
Добавлено: Чт май 16, 2013 11:59:08
Kavka
Так это про обычные внешние переменные. Если вы переменную прицепили/зарезервировали на регистре, то на счёт того, что это будет отражено в объектном файле...да же не знаю.
Или вам, таки, обычную и надо.
Re: Вопросы по С/С++ (СИ)
Добавлено: Чт май 16, 2013 13:03:19
shads
Kavka писал(а):Так это про обычные внешние переменные. Если вы переменную прицепили/зарезервировали на регистре, то на счёт того, что это будет отражено в объектном файле...да же не знаю.
Или вам, таки, обычную и надо.
Именно регистровая переменная.....
Я думал что нет разницы, какая она - регистровая или обычная... главное глобальная...
Re: Вопросы по С/С++ (СИ)
Добавлено: Пт май 24, 2013 09:39:44
Мikа
Привет, Коты. Как всегда, тупой-ьтупой вопрос в исполнении меня. Читаю
http://avr123.nm.ru/05.htm - краткий курс по Си.
Есть такой момент
Спойлер
00010010 ^ 01001111
/* "исключающее ИЛИ" - результат любое из пары чисел в котором инвертированы (изменены) биты напротив битов равных "1" в другом числе.
англ. название XOR */
01011101 // это результат
/* изменились биты во втором числе напротив
установленных битов 4 и 1 первого числа. */
И тут вот вопрос. Нет ли очепятки.
Берём число РАЗ, делаем искл ИЛИ с числом ДВА
РАЗ^ДВА.
В результате мы получим преобразованное по маске число РАЗ, правильно?
То есть, например:
00010101^00001111 даст нам 00011010 - первое число, с перевёрнутыми битами напротив единиц второго числа.
Re: Вопросы по С/С++ (СИ)
Добавлено: Пт май 24, 2013 09:56:03
Gudd-Head
Мikа писал(а):Нет ли очепятки.
Виндовский калькулятор вам в помощь.
Re: Вопросы по С/С++ (СИ)
Добавлено: Пт май 24, 2013 10:12:37
Kavka
...а ещё есть поисковики и
википедиа 
Re: Вопросы по С/С++ (СИ)
Добавлено: Пт май 24, 2013 10:15:37
Мikа
По-ходу очепятки нет
Re: Вопросы по С/С++ (СИ)
Добавлено: Пт май 24, 2013 11:29:53
ibiza11
Очепятки нет.
Мikа писал(а):В результате мы получим преобразованное по маске число РАЗ, правильно?
И здесь все правильно.
Re: Вопросы по С/С++ (СИ)
Добавлено: Пт май 24, 2013 12:02:32
Мikа
В Вкикпедии так:
a = 01100101
b = 00101001
то
a ^ b = 01001100
Тогда каша. Википедия говорит, что мы в результате получаем изменённое А, а сайт 123авр, что измененное Б.
Re: Вопросы по С/С++ (СИ)
Добавлено: Пт май 24, 2013 12:06:29
Gudd-Head
Что ещё за А, Б, В? Есть 2 операнда и есть результат.
Re: Вопросы по С/С++ (СИ)
Добавлено: Пт май 24, 2013 12:20:31
Мikа
Что-то я вообще дно. Я хотел спросить, на какое из чисел (слева или справа от знака ^) мы применяем маску. Но пока переписывал этот вопрос, в ручную написал пару примеров и увидел, что получается одно и то же число
То есть берем 11001 и инвертируем его по маске 01011, получаем 10010. Потом берем 01011 и инвертируем его по маске 11001, получаем 10010. Короче бред новичка. Первоклассный оффтоп в моём исполнении, извините

Re: Вопросы по С/С++ (СИ)
Добавлено: Пт май 24, 2013 12:28:51
vitalik_1984
Gudd-Head писал(а):Что ещё за А, Б, В?
Про В речь и не шла.
это про переменные, с которыми производятся данные действия просто так названы a,b
Мikа писал(а):Википедия говорит, что мы в результате получаем изменённое А,а сайт 123авр, что измененное Б.
Не верь всему что написано возьми калькулятор и все поймешь. Реально Вики правильно пишет.
01100
101
00101
001
01001
100 b меняется, зато А не меняется
0110
0101
0010
1001
0100
1100 b не меняется, зато А меняется.
Итог от перестановки мест слагаемых сумма не меняется.
Вообще самое простое понятное человеку, если операнды не равны друг другу, то в ответе будет 1. 0 и 0 = 0 ; 1 и 0 = 1; 1 и 1 = 0.
Re: Вопросы по С/С++ (СИ)
Добавлено: Пт май 24, 2013 13:01:12
Мikа
Вот теперь уяснил, большое спасибо

Re: Вопросы по С/С++ (СИ)
Добавлено: Пт май 24, 2013 15:25:44
Мikа
Подскажите, пожалуйста, правильно ли я всё это дело читаю и понимаю. (Да, я знаю, что строчка инвертирует младший бит в PORTB, но хотелось бы понять весь процесс).
PORTB ^= 1 << PINB0
PORTB //Берем то, что есть в PORTB, пусть 0b00000000
1 << PINB0 //Берем число 0b00000000 (8 знаков, т.к. в PORTB 8 ног) и нулевой бит числа устанавливаем в 1. Получается 0b00000001
^= - выполнить побитное исключающее ИЛИ между PORTB(0b00000000) и 1 << PINB0(0b00000001) и записать результат в PORTB
Я знаю, что вопрос тупой, знаю что море инфы и т.п. Но хотелось бы от живых людей услышать, что всё так или всё не так, т.к. азы.
Re: Вопросы по С/С++ (СИ)
Добавлено: Пт май 24, 2013 15:49:51
ibiza11
верно.
Re: Вопросы по С/С++ (СИ)
Добавлено: Пт май 24, 2013 21:29:15
menzoda
Но не совсем.
1 << PINB0 Берем число 1 и побитово сдвигаем влево на PINB0. В данном случае PINB0 равен нулю, то есть побитового сдвига как такового не будет, и в результате единица останется единицей.
Re: Вопросы по С/С++ (СИ)
Добавлено: Пт май 24, 2013 21:53:36
Kavka
menzoda, он и не должен быть равен нулю.
Надо инвертировать бит с номером 0 (ноль). Для "исключающего или" конструкция 1 << PINB0 как раз и даёт нужный операнд.
Что не понравилось то?