реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> вывод через printf переменной unsigned long int, printf
messenger
сообщение Jan 9 2013, 14:01
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 361
Регистрация: 23-03-07
Пользователь №: 26 457



Здравствуйте уважаемые пользователи форума!
Столкунлся с проблемой и прошу помощи.
Конроллер ATmega16? среда CVAVR

обявляю прерменную 32 бита
unsigned long int REG_0=0b0...........................................01 (32 бита)
вывожу через printf
printf("REG0= %u ",REG_0);

но явно пропадают первые два старших байта, не могу разобраться как быть.

и насколько правильно выделять из unsigned long int 4 байта типа unsigned char

bait_1=REG_0 & 0xFF;
bait_2=(REG_0>>=8) & 0xFF;
bait_3=(REG_0>>=8) & 0xFF;
bait_4=(REG_0>>=8) & 0xFF;

Спасибо
Go to the top of the page
 
+Quote Post
SM
сообщение Jan 9 2013, 14:22
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881



%u - это просто "int", который архитектурно-зависимую длину имеет, в Вашем случае 16 бит.
чтобы корректно вывести long int - нужна последовательность %lu

Байты так выделять некорректно - у Вас сдвиг везде на 8. Корректно - на 8, потом на 16, потом на 24. И то лишь в случае, если требуемый порядок следования байт "little endian", то есть первым по порядку следует младший байт.

UPD:
Упс. Извините, не заметил, что там ">>=". Корректно байты выделять так. Но с учетом "little endian", и не факт, что оптимизатор правильно поймет и скомпилирует в оптимальную конструкцию.
Go to the top of the page
 
+Quote Post
messenger
сообщение Jan 9 2013, 14:34
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 361
Регистрация: 23-03-07
Пользователь №: 26 457



SM большое спасибо за "lu" не известно сколько бы я еще происидел, не нашел этого момента в хелпе на CVAVR.
по поводу второго тоже спасибо)
Go to the top of the page
 
+Quote Post
SM
сообщение Jan 9 2013, 14:39
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881



Цитата(messenger @ Jan 9 2013, 18:34) *
не нашел этого момента в хелпе на CVAVR.

Видимо, не там искали. Это не относится к конкретной реализации C компилятора, это относится к языку С вообще.
Go to the top of the page
 
+Quote Post
Misile_Inc
сообщение Feb 20 2013, 09:33
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 174
Регистрация: 30-08-11
Из: Санкт-Петербург
Пользователь №: 66 926



Лучше не приучайтесь использовать printf. Это плохой стиль для встраиваемых систем.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Feb 20 2013, 09:50
Сообщение #6


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(Misile_Inc @ Feb 20 2013, 12:33) *
Лучше не приучайтесь использовать printf. Это плохой стиль для встраиваемых систем.

qu'est-ce que c'est?
Go to the top of the page
 
+Quote Post
Misile_Inc
сообщение Feb 20 2013, 11:10
Сообщение #7


Частый гость
**

Группа: Участник
Сообщений: 174
Регистрация: 30-08-11
Из: Санкт-Петербург
Пользователь №: 66 926



Всякие стандарты типа MISRA запрещают использование функций, в прототипах которых есть многоточие (elipsis).
Go to the top of the page
 
+Quote Post
ReAl
сообщение Feb 20 2013, 11:11
Сообщение #8


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Ой, да неужели непонятно, что слова «это плохой стиль для встраиваемых систем» означают «это сделано не так, как привык тот, кто сказал, что это плохой стиль».
Если не всегда, то почти всегда. Сказанные «вообще», без учета конкретных ограничений конкретной системы — всегда. Но с учётом ограничений это не «плохой стиль», а «неучёт ограничений».

Для на всякий случай хочу сразу сказать, что компы, на которых появился и сам С, и его printf в библиотеке, находятся где-то на уровне от atmega162+внешнее ОЗУ до atmega64 — по ресурсам. По быстродействию на порядок-полтора медленнее. Те компы медленнее, чем AVR-ки, а не наоборот.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
Misile_Inc
сообщение Feb 20 2013, 11:13
Сообщение #9


Частый гость
**

Группа: Участник
Сообщений: 174
Регистрация: 30-08-11
Из: Санкт-Петербург
Пользователь №: 66 926



Цитата(messenger @ Jan 9 2013, 18:01) *
bait_1

Так тоже не надо делать. Транслитерация для любых платформ является плохим стилем


ReAl, нет, это значит "Это сделано не так, как рекомендует промышленный стандарт". Не нужно отвечать за меня- это тоже плохой стиль. Я сам могу.

Сообщение отредактировал Misile_Inc - Feb 20 2013, 11:14
Go to the top of the page
 
+Quote Post
ReAl
сообщение Feb 20 2013, 11:16
Сообщение #10


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(Misile_Inc @ Feb 20 2013, 13:10) *
Всякие стандарты типа MISRA запрещают использование функций, в прототипах которых есть многоточие (elipsis).
Тогда «плохой стиль с точки зрения мисры», а не «плохой стиль для embedded вообще».
Причина в том, что код с функцями с эллипсисом несколько труднее формально верифицировать, чем десять строк тупых itoa()/strlen()/put_spaces()/putstr(). Но в результате то, что можно написать одним вызовом printf, придётся писать несколькими строками вызовов разных функций и ещё неизвестно, где легче ошибку сделать как при начальном написании, так и при модификации.

А GCC, например, умеет сам ругаться на несоответствие количества и типов аргументов форматной строке printf (в духе «третий спецификатор для long, а туда сунули char*»). И даже про свою функцию lcd_printf(int x, int y, const char *fmt, ...) ему можно объяснить, каким аргументом идёт форматная строка и он проверит всё.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
Misile_Inc
сообщение Feb 20 2013, 11:18
Сообщение #11


Частый гость
**

Группа: Участник
Сообщений: 174
Регистрация: 30-08-11
Из: Санкт-Петербург
Пользователь №: 66 926



Не только мисры. Вот ссылки на пункты стандартов, не рекомендующие использование функций с неограниченным колличеством аргументов.
Related standards model rules
CAST : 5.1.7
CERT-C : DCL10-C, DCL11-C
CERT-J : DCL02-J
CMSE : 1.1.8
CWE : 628
DERA : 69
EADS-C++ : 40
FSB582-C : 3.6.5
GJB : 4.1.1.8
HIC++ : 11.6
HIS : 69
JPL : 8
JSF++ AV : 108
LMTCP : 203
MISRA-AC : 16.1
MISRA-C++:2008 : 8-4-1
MISRA-C:1998 : 69
MISRA-C:2004 : 16.1
SEC-C : R2.8.2

Сообщение отредактировал Misile_Inc - Feb 20 2013, 11:28
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 20:56
Рейтинг@Mail.ru


Страница сгенерированна за 0.0145 секунд с 7
ELECTRONIX ©2004-2016