Easyelectronics.ru

Электроника для всех
Текущее время: 22 май 2022, 15:55

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 19 ] 
Автор Сообщение
 Заголовок сообщения: Непонятки с Си в CVAVR
СообщениеДобавлено: 28 фев 2021, 13:10 
Заглядывает иногда

Зарегистрирован: 21 ноя 2014, 22:45
Сообщения: 169
Прошу прощения, но снова вынужден обратится к специалистам.
Я тут осваиваю CVAVR и возникли елементарные нерешаемые вопросы. Надо к long прибавить int.Схематично это так:
unsigned long int counter=50000;
unsigned int temp=20000;
counter=counter+temp;
- здесь должно быть 70000, а получается 4485?? То есть старший бит исчезает в непонятном направлении. В ассемблере и АЛГБ с этим проблем нет. Попытка использовать хирожо... сишное приведение типов результата не дала.
Подскажите пожалуста, где мой косяк?
Спасибо!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Непонятки с Си в CVAVR
СообщениеДобавлено: 28 фев 2021, 14:11 
Старожил
Аватара пользователя

Зарегистрирован: 18 июн 2011, 16:29
Сообщения: 2585
Откуда: Волноваха
Не нужно тут приведение вручную делать, здесь должно выполниться неявное приведение самим компилятором.
Цитата:
Рассмотрим, какие преобразования применяет компилятор при арифметических операциях:
Если один из операндов имеет тип long double, то второй операнд тоже будет преобразован в тип long double
Если предыдущий пункт не выполняется и если один из операндов имеет тип double, то второй операнд тоже будет преобразован к типу double
Если предыдущий пункт не выполняется и если один из операндов имеет тип float, то второй операнд тоже будет преобразован к типу float
Если предыдущий пункт не выполняется и если один из операндов имеет тип unsigned long int, то второй операнд тоже будет преобразован к типу unsigned long int
Если предыдущий пункт не выполняется и если один из операндов имеет тип long, то второй операнд тоже будет преобразован к типу long
Если предыдущий пункт не выполняется и если один из операндов имеет тип unsigned, то второй операнд тоже будет преобразован к типу unsigned
Если предыдущий пункт не выполняется то оба операнда приводятся к типу int

У вас результирующая переменная имеет тип unsigned long int, что заведомо больше результата сложения. Ищите ошибку в другом месте.

_________________
Хранитель форума


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Непонятки с Си в CVAVR
СообщениеДобавлено: 28 фев 2021, 16:02 
Старожил

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 3819
Что-то вы недоговариваете. В приведенном куске всё нормально и получается 70000: https://godbolt.org/z/9dh4EW


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Непонятки с Си в CVAVR
СообщениеДобавлено: 28 фев 2021, 16:31 
Заглядывает иногда

Зарегистрирован: 21 ноя 2014, 22:45
Сообщения: 169
NStorm писал(а):
Что-то вы недоговариваете. В приведенном куске всё нормально и получается 70000: https://godbolt.org/z/9dh4EW

Так не знаю что договаривать. Вот фрагмент кода:

//Stop Timer1
TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (0<<WGM12) | (0<<CS12) | (0<<CS11) | (0<<CS10);
#asm("cli")

temp = TCNT1L;
temp |= (unsigned int) TCNT1H<<8;
counter=counter+(long int)temp;

ltoa(counter, ptr_to_ram);
lcd_gotoxy(7,0);
lcd_puts(ptr_to_ram);


Последний раз редактировалось Gregory48 28 фев 2021, 16:38, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Непонятки с Си в CVAVR
СообщениеДобавлено: 28 фев 2021, 16:37 
Старожил
Аватара пользователя

Зарегистрирован: 11 апр 2016, 18:04
Сообщения: 4851
Откуда: Китай, Пекин
Цитата:
unsigned long int
unsigned int

а для чего люди так мучуются? есть жеж <stdint.h>


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Непонятки с Си в CVAVR
СообщениеДобавлено: 28 фев 2021, 16:40 
Старожил
Аватара пользователя

Зарегистрирован: 18 июн 2011, 16:29
Сообщения: 2585
Откуда: Волноваха
ltoa(counter, ptr_to_ram); //char *str)

Цитата:
char * ltoa(long l, char * buffer, int radix);

http://www.c-cpp.ru/content/ltoa-ultoa

разве в КодВижене нет справки по встроенным функциям? И компилер ни разу не ругается на указанную строчку?

_________________
Хранитель форума


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Непонятки с Си в CVAVR
СообщениеДобавлено: 28 фев 2021, 17:42 
Заглядывает иногда

Зарегистрирован: 21 ноя 2014, 22:45
Сообщения: 169
Нет, не ругается. так проблема в том, что если counter<0xFFFF - все нормально, а если counter>0xFFFF - получается недоразумение.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Непонятки с Си в CVAVR
СообщениеДобавлено: 28 фев 2021, 18:21 
Старожил

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 3819
Gregory48, и снова недоговариваете. Как объявлена ptr_to_ram? Где функция lcd_puts?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Непонятки с Си в CVAVR
СообщениеДобавлено: 28 фев 2021, 20:04 
Заглядывает иногда

Зарегистрирован: 21 ноя 2014, 22:45
Сообщения: 169
NStorm писал(а):
Gregory48, и снова недоговариваете. Как объявлена ptr_to_ram? Где функция lcd_puts?

unsigned long int counter=0;
unsigned int temp=0;
unsigned char *ptr_to_ram="This string is placed in RAM";

Функция lcd_puts из библиотеки alcd.h


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Непонятки с Си в CVAVR
СообщениеДобавлено: 28 фев 2021, 20:16 
Старожил
Аватара пользователя

Зарегистрирован: 18 июн 2011, 16:29
Сообщения: 2585
Откуда: Волноваха
Цитата:
здесь должно быть 70000, а получается 4485?? То есть старший бит исчезает в непонятном направлении
70000 -> bin = 0b10001000101110000
Если обнулить MSB то получится 4464. Снова где-то не сходится...

_________________
Хранитель форума


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Непонятки с Си в CVAVR
СообщениеДобавлено: 28 фев 2021, 20:28 
Заглядывает иногда

Зарегистрирован: 21 ноя 2014, 22:45
Сообщения: 169
Финский писал(а):
Цитата:
здесь должно быть 70000, а получается 4485?? То есть старший бит исчезает в непонятном направлении
70000 -> bin = 0b10001000101110000
Если обнулить MSB то получится 4464. Снова где-то не сходится...


Пардон, оно так и есть, память подвела.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Непонятки с Си в CVAVR
СообщениеДобавлено: 28 фев 2021, 20:44 
Старожил
Аватара пользователя

Зарегистрирован: 18 июн 2011, 16:29
Сообщения: 2585
Откуда: Волноваха
Попробуйте
char lcd_buffer[16];
char *ptr_to_ram=lcd_buffer;
unsigned long int counter=70000;

ltoa(counter, ptr_to_ram);
lcd_gotoxy(7,0);
lcd_puts(ptr_to_ram);

_________________
Хранитель форума


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Непонятки с Си в CVAVR
СообщениеДобавлено: 28 фев 2021, 21:55 
Заглядывает иногда

Зарегистрирован: 21 ноя 2014, 22:45
Сообщения: 169
Финский писал(а):
Попробуйте
char lcd_buffer[16];
char *ptr_to_ram=lcd_buffer;
unsigned long int counter=70000;

ltoa(counter, ptr_to_ram);
lcd_gotoxy(7,0);
lcd_puts(ptr_to_ram);


Странно, но Ваша версия работает. Большое спасибо!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Непонятки с Си в CVAVR
СообщениеДобавлено: 28 фев 2021, 22:19 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1703
Gregory48 писал(а):
Странно, но Ваша версия работает.

Странно, что твоя хоть как-то работала :)
Код:
unsigned char *ptr_to_ram="This string is placed in RAM";

Эта строка размещается во флеше, потому что тип самой строки константный, а какому указателю присваивается ее адрес без разницы. Можно считать такую запись эквивалентой следующей:
Код:
const char lcd_buffer[] = "This string is placed in RAM";
char *ptr_to_ram = lcd_buffer;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Непонятки с Си в CVAVR
СообщениеДобавлено: 28 фев 2021, 22:41 
Старожил
Аватара пользователя

Зарегистрирован: 18 июн 2011, 16:29
Сообщения: 2585
Откуда: Волноваха
Мой вариант можно ещё упростить, если передавать в ltoa не указатель, а сам массив, соответственно, в функцию lcd_puts тоже.

_________________
Хранитель форума


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Непонятки с Си в CVAVR
СообщениеДобавлено: 28 фев 2021, 23:47 
Только пришел

Зарегистрирован: 04 окт 2019, 22:19
Сообщения: 17
Reflector писал(а):
Код:
unsigned char *ptr_to_ram="This string is placed in RAM";

Эта строка размещается во флеше,

Почему?
"Variables placed in RAM are accessed using normal pointers.
For accessing constants placed in FLASH memory, the flash or __flash memory attributes are used.
For accessing variables placed in EEPROM, the eeprom or __eeprom memory attributes are used."
"Доступ к переменным, размещенным в ОЗУ, осуществляется с помощью обычных указателей.
Для доступа к константам, размещенным во флэш-памяти, используются атрибуты флэш-памяти или __flash-памяти.
Для доступа к переменным, размещенным в EEPROM, используются атрибуты памяти eeprom или __eeprom."


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Непонятки с Си в CVAVR
СообщениеДобавлено: 01 мар 2021, 00:24 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1703
kolin писал(а):
Почему?

CVAVR конечно специфический компилятор, но разве там нужно делать так чтобы указать, что строка находится во флеше?
Код:
func(__flash "abc");


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Непонятки с Си в CVAVR
СообщениеДобавлено: 01 мар 2021, 00:44 
Только пришел

Зарегистрирован: 04 окт 2019, 22:19
Сообщения: 17
Reflector писал(а):
kolin писал(а):
Почему?

CVAVR конечно специфический компилятор, но разве там нужно делать так чтобы указать, что строка находится во флеше?
Код:
func(__flash "abc");

Указывается так:
flash char Norma[]={"NORMAL"}; //флэш
eeprom char nD[14]; //eeprom


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Непонятки с Си в CVAVR
СообщениеДобавлено: 01 мар 2021, 00:58 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1703
kolin писал(а):
Указывается так:

Конкретно с функцией что будет? Я же могу написать func("abc")? Где, в таком случае, разместится строка?


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 19 ] 


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB