Вопросы по С/С++ (СИ)

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Аватара пользователя
Kavka
Мудрый кот
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Re: Вопросы по С/С++ (СИ)

Сообщение 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");
В обоих случаях компилятор не использует указанный регистр. Да же если "вычищены" операции с этим регистром (не имеющие смысла по "мнению" компилятора).
Т.е. регистр, похоже, реально зарезервирован. В дизассемблерном файле просто нет никакого упоминания этого регистра.
Проверял так. Брал прогу, компилил, смотрел дизассемблер, выбирал какой-либо используемый регистр, резервировал регистр, компилил, смотрел дизассемблер.

А собранные библиотеки вы используете? А они скомпилированы с резервированием этого регистра. :)
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Реклама
Аватара пользователя
shads
Опытный кот
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Re: Вопросы по С/С++ (СИ)

Сообщение shads »

Kavka писал(а):Т.е. регистр, похоже, реально зарезервирован. В дизассемблерном файле просто нет никакого упоминания этого регистра.
Может он и зарезервирован... надо будет еще раз поэксперементировать в моем случае.
Но почему он не инициализируется значением.... которое я явно загружаю в регистровую переменную...
Т.е. можно заключить, что он все таки резервирует регистр, но из за того что не видит его использования, опускает инициализацию... тогда зачем он его резервирует?....

Kavka писал(а):А собранные библиотеки вы используете? А они скомпилированы с резервированием этого регистра. :)
Имеете ввиду сторонние библиотеки? Не я использую только 2 свои файла, сишный и асмовый, без посторонних включений.
Реклама
Аватара пользователя
Kavka
Мудрый кот
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Re: Вопросы по С/С++ (СИ)

Сообщение 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){
    }
}
Ставим плюсы :)
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Аватара пользователя
shads
Опытный кот
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Re: Вопросы по С/С++ (СИ)

Сообщение 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 писал(а):Ну, в конце концов, сделайте вот так.....
Да в принципе я могу по нормальному еще одну функцию кинуть в ассемблерный файл, функцию инициализации регистровых переменных, я просто переживал что си не резервирует их.... ну а раз он их все таки резервирует, то тут уже вариантов куча, как их проинитить.....
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Kavka
Мудрый кот
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Re: Вопросы по С/С++ (СИ)

Сообщение Kavka »

Так это про обычные внешние переменные. Если вы переменную прицепили/зарезервировали на регистре, то на счёт того, что это будет отражено в объектном файле...да же не знаю.
Или вам, таки, обычную и надо.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Реклама
Аватара пользователя
shads
Опытный кот
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Re: Вопросы по С/С++ (СИ)

Сообщение shads »

Kavka писал(а):Так это про обычные внешние переменные. Если вы переменную прицепили/зарезервировали на регистре, то на счёт того, что это будет отражено в объектном файле...да же не знаю.
Или вам, таки, обычную и надо.

Именно регистровая переменная.....
Я думал что нет разницы, какая она - регистровая или обычная... главное глобальная...
Реклама
Аватара пользователя
Мikа
Потрогал лапой паяльник
Сообщения: 343
Зарегистрирован: Пн апр 01, 2013 15:13:40
Откуда: Москва

Re: Вопросы по С/С++ (СИ)

Сообщение Мikа »

Привет, Коты. Как всегда, тупой-ьтупой вопрос в исполнении меня. Читаю http://avr123.nm.ru/05.htm - краткий курс по Си.

Есть такой момент


Спойлер00010010 ^ 01001111
/* "исключающее ИЛИ" - результат любое из пары чисел в котором инвертированы (изменены) биты напротив битов равных "1" в другом числе.

англ. название XOR */
01011101 // это результат

/* изменились биты во втором числе напротив
установленных битов 4 и 1 первого числа. */


И тут вот вопрос. Нет ли очепятки.

Берём число РАЗ, делаем искл ИЛИ с числом ДВА

РАЗ^ДВА.

В результате мы получим преобразованное по маске число РАЗ, правильно?
То есть, например:
00010101^00001111 даст нам 00011010 - первое число, с перевёрнутыми битами напротив единиц второго числа.
Почему я здесь и задаю тупые вопросы?
Потому что хочу научиться.
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: Вопросы по С/С++ (СИ)

Сообщение Gudd-Head »

Мikа писал(а):Нет ли очепятки.

Виндовский калькулятор вам в помощь.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
Kavka
Мудрый кот
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Re: Вопросы по С/С++ (СИ)

Сообщение Kavka »

...а ещё есть поисковики и википедиа :)
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Аватара пользователя
Мikа
Потрогал лапой паяльник
Сообщения: 343
Зарегистрирован: Пн апр 01, 2013 15:13:40
Откуда: Москва

Re: Вопросы по С/С++ (СИ)

Сообщение Мikа »

По-ходу очепятки нет
Почему я здесь и задаю тупые вопросы?
Потому что хочу научиться.
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Re: Вопросы по С/С++ (СИ)

Сообщение ibiza11 »

Очепятки нет.
Мikа писал(а):В результате мы получим преобразованное по маске число РАЗ, правильно?
И здесь все правильно.
Ставим плюсы: )
Аватара пользователя
Мikа
Потрогал лапой паяльник
Сообщения: 343
Зарегистрирован: Пн апр 01, 2013 15:13:40
Откуда: Москва

Re: Вопросы по С/С++ (СИ)

Сообщение Мikа »

В Вкикпедии так:

a = 01100101
b = 00101001
то
a ^ b = 01001100

Тогда каша. Википедия говорит, что мы в результате получаем изменённое А, а сайт 123авр, что измененное Б.
Почему я здесь и задаю тупые вопросы?
Потому что хочу научиться.
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: Вопросы по С/С++ (СИ)

Сообщение Gudd-Head »

Что ещё за А, Б, В? Есть 2 операнда и есть результат.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
Мikа
Потрогал лапой паяльник
Сообщения: 343
Зарегистрирован: Пн апр 01, 2013 15:13:40
Откуда: Москва

Re: Вопросы по С/С++ (СИ)

Сообщение Мikа »

Что-то я вообще дно. Я хотел спросить, на какое из чисел (слева или справа от знака ^) мы применяем маску. Но пока переписывал этот вопрос, в ручную написал пару примеров и увидел, что получается одно и то же число :facepalm:

То есть берем 11001 и инвертируем его по маске 01011, получаем 10010. Потом берем 01011 и инвертируем его по маске 11001, получаем 10010. Короче бред новичка. Первоклассный оффтоп в моём исполнении, извините :facepalm: :facepalm:
Почему я здесь и задаю тупые вопросы?
Потому что хочу научиться.
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение vitalik_1984 »

Gudd-Head писал(а):Что ещё за А, Б, В?

Про В речь и не шла.
это про переменные, с которыми производятся данные действия просто так названы a,b
Мikа писал(а):Википедия говорит, что мы в результате получаем изменённое А,а сайт 123авр, что измененное Б.

Не верь всему что написано возьми калькулятор и все поймешь. Реально Вики правильно пишет.
01100101
00101001
01001100 b меняется, зато А не меняется

01100101
00101001
01001100 b не меняется, зато А меняется.
Итог от перестановки мест слагаемых сумма не меняется.
Вообще самое простое понятное человеку, если операнды не равны друг другу, то в ответе будет 1. 0 и 0 = 0 ; 1 и 0 = 1; 1 и 1 = 0.
Аватара пользователя
Мikа
Потрогал лапой паяльник
Сообщения: 343
Зарегистрирован: Пн апр 01, 2013 15:13:40
Откуда: Москва

Re: Вопросы по С/С++ (СИ)

Сообщение Мikа »

Вот теперь уяснил, большое спасибо :)
Почему я здесь и задаю тупые вопросы?
Потому что хочу научиться.
Аватара пользователя
Мikа
Потрогал лапой паяльник
Сообщения: 343
Зарегистрирован: Пн апр 01, 2013 15:13:40
Откуда: Москва

Re: Вопросы по С/С++ (СИ)

Сообщение Мikа »

Подскажите, пожалуйста, правильно ли я всё это дело читаю и понимаю. (Да, я знаю, что строчка инвертирует младший бит в PORTB, но хотелось бы понять весь процесс).

PORTB ^= 1 << PINB0

PORTB //Берем то, что есть в PORTB, пусть 0b00000000
1 << PINB0 //Берем число 0b00000000 (8 знаков, т.к. в PORTB 8 ног) и нулевой бит числа устанавливаем в 1. Получается 0b00000001
^= - выполнить побитное исключающее ИЛИ между PORTB(0b00000000) и 1 << PINB0(0b00000001) и записать результат в PORTB

Я знаю, что вопрос тупой, знаю что море инфы и т.п. Но хотелось бы от живых людей услышать, что всё так или всё не так, т.к. азы.
Почему я здесь и задаю тупые вопросы?
Потому что хочу научиться.
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Re: Вопросы по С/С++ (СИ)

Сообщение ibiza11 »

верно.
Ставим плюсы: )
Аватара пользователя
menzoda
Вымогатель припоя
Сообщения: 535
Зарегистрирован: Вт авг 28, 2012 22:21:33

Re: Вопросы по С/С++ (СИ)

Сообщение menzoda »

Но не совсем.

1 << PINB0 Берем число 1 и побитово сдвигаем влево на PINB0. В данном случае PINB0 равен нулю, то есть побитового сдвига как такового не будет, и в результате единица останется единицей.
Аватара пользователя
Kavka
Мудрый кот
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Re: Вопросы по С/С++ (СИ)

Сообщение Kavka »

menzoda, он и не должен быть равен нулю.
Надо инвертировать бит с номером 0 (ноль). Для "исключающего или" конструкция 1 << PINB0 как раз и даёт нужный операнд.
Что не понравилось то?
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Ответить

Вернуться в «Разные вопросы по МК»