Отговори на тема  [ 16 мнения ]  Отиди на страница 1, 2  Следваща
Странно поведение на функция GNU-C 
Автор Съобщение
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Сря Сеп 16, 2009 7:30 pm
Мнения: 28
Мнение Странно поведение на функция GNU-C
За много години на всички :).Много здраве и щастие :)

Къде бъркам,че тая функция
Код:
void UART_config(unsigned long FCPU,unsigned int BAUDR)
{
   unsigned int UBRR;
   UBRR=(FCPU/(16*BAUDR))-1;
   UDR=UBRR;
   
}


извикана със следните параметри

Код:
UART_config(16000000,9600);


да връща 0xC5 , вместо 0x67 (толкова е UBRR за 16MHz и 9600bps)?


Чет Яну 01, 2015 10:37 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Вто Яну 10, 2006 2:40 pm
Мнения: 2258
Мнение Re: Странно поведение на функция GNU-C
я пак, функция void какво да връща?


Чет Яну 01, 2015 11:29 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Сря Сеп 16, 2009 7:30 pm
Мнения: 28
Мнение Re: Странно поведение на функция GNU-C
Не се изказах правилно.Правилният въпрос е,защо присвоява на нещо си (в случая регистъра на серийния порт) грешна стойност?.Ясно е,че void няма как да връща нещо :)


Чет Яну 01, 2015 11:37 pm
Профил
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Чет Окт 02, 2008 10:24 pm
Мнения: 105
Мнение Re: Странно поведение на функция GNU-C
така е защото (16*BAUDR) е 16 битов резултат
кастни то uint32 във скобите


Чет Яну 01, 2015 11:39 pm
Профил ICQ
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Сря Сеп 16, 2009 7:30 pm
Мнения: 28
Мнение Re: Странно поведение на функция GNU-C
Точно в 10-ката :).Не се бях сетил за това.
Благодаря :)


Чет Яну 01, 2015 11:57 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Пон Дек 12, 2005 3:30 pm
Мнения: 13
Местоположение: SOFIA
Мнение Re: Странно поведение на функция GNU-C
защо не напишеш:

UBRR=FCPU/16/BAUDR-1;

така избягваш големия междинен резултат от умножението.

Отделно за къкъв процесор е това gcc че int-а му е 16bit?


Вто Фев 03, 2015 7:41 pm
Профил ICQ WWW
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Фев 24, 2005 11:41 pm
Мнения: 1049
Местоположение: Pz
Мнение Re: Странно поведение на функция GNU-C
Код:
UBRR=(((FCPU/BAUDR)/8)-1)/2)

Аз ползвам това. Няма голям междинен резултат и е по-точно.


Сря Фев 04, 2015 9:13 am
Профил ICQ
Ранг: Ориентиран
Ранг: Ориентиран

Регистриран на: Пет Авг 07, 2009 4:58 pm
Мнения: 273
Мнение Re: Странно поведение на функция GNU-C
Аз ползвам код, който закръгля към по-голям резултат, ако той преминава с 0.5 цялата част на числото (25.8 => 26). Разбира се, изразходва доста повече памет.

#define ROUND(a) ( ((uint32_t) (a) < (uint32_t) ((a) + 0.5))? (uint32_t) (a + 1) : (uint32_t) (a))
#define F_OSC (64) // in MHz
#define UINT16_BYTE_MSB(WORD) ((WORD) >> 8 )
#define UINT16_BYTE_LSB(WORD) ((uint8_t) (WORD))

#define BAUD_RATE1 (38400UL)
#define SPBRG1_VALUE ((uint16_t) ROUND(((float) F_OSC) * 1000000UL / (BAUD_RATE1 * 4) - 1)) // Used with BRG16=1, BRGH=1.

...

SPBRGH1 = UINT16_BYTE_MSB(SPBRG1_VALUE); // Baud Rate Generator High Byte.
SPBRG1 = UINT16_BYTE_LSB(SPBRG1_VALUE); // Baud Rate Generator Low Byte.


Пет Фев 06, 2015 9:52 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пет Фев 04, 2005 9:59 pm
Мнения: 6019
Местоположение: София
Мнение Re: Странно поведение на функция GNU-C
marcuka68 написа:
Разбира се, изразходва доста повече памет.

Обикновенно при микроконтролерите се ползва една скорост или 9600 или 115200. Като набиеш изчислението в макрос, компилатора го изчислява по време на компилирането и не заема никаква памет или процесорно време.

_________________
Warriors of the Night, ASSEMBLER!!!


Пет Фев 06, 2015 3:33 pm
Профил
Ранг: Ориентиран
Ранг: Ориентиран

Регистриран на: Пет Авг 07, 2009 4:58 pm
Мнения: 273
Мнение Re: Странно поведение на функция GNU-C
Гледах сутринта изразходваната програмна памет и беше с около 40 байта повече, ако ползвам макрос. Ползвам свободната версия на xc8. Струва ми се, че не изчислява предварително, а само замества в кода макроса, с неговото съответствие. Най-вероятно не ми е известно нещо.


Пет Фев 06, 2015 3:43 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пон Сеп 27, 2004 9:22 am
Мнения: 15501
Местоположение: София
Мнение Re: Странно поведение на функция GNU-C
Е това ще е наистина гениално творение (тоя компилатор) ако верно са направили тая простотия. Елементарно е да се провери де, просто отвори lst файла :)

_________________
"Да еба и шибаната държава" мислеше си Гошо, докато се опитваше да улучи кофата за боклук от балкона на осмия етаж.


Пет Фев 06, 2015 6:13 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пет Юни 03, 2005 9:39 pm
Мнения: 2277
Мнение Re: Странно поведение на функция GNU-C
Нищо му няма, компилаторът генерира код за окръглянето - препроцесорът не може(не трябва) да го смята.

_________________
Определянето стойността на дадена величина се нарича ИЗМЕРВАНЕ! Опонентът се оборва с ФАКТИ, а не с ЕПИТЕТИ!


Пет Фев 06, 2015 7:50 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пон Сеп 27, 2004 9:22 am
Мнения: 15501
Местоположение: София
Мнение Re: Странно поведение на функция GNU-C
Да аз не съм дочел, при така написаните макроси е нормално да генерира код.

_________________
"Да еба и шибаната държава" мислеше си Гошо, докато се опитваше да улучи кофата за боклук от балкона на осмия етаж.


Пет Фев 06, 2015 7:52 pm
Профил ICQ
Ранг: Ориентиран
Ранг: Ориентиран

Регистриран на: Пет Авг 07, 2009 4:58 pm
Мнения: 273
Мнение Re: Странно поведение на функция GNU-C
syscop написа:
Нищо му няма, компилаторът генерира код за окръглянето - препроцесорът не може(не трябва) да го смята.


За кои операции се генерира код и за кой не? Къде е описано това нещо?


Пет Фев 06, 2015 11:11 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пет Юни 03, 2005 9:39 pm
Мнения: 2277
Мнение Re: Странно поведение на функция GNU-C
#define ROUND(a) ( ((uint32_t) (a) < (uint32_t) ((a) + 0.5))? (uint32_t) (a + 1) : (uint32_t) (a)) - прегледай изхода от препроцесора.

_________________
Определянето стойността на дадена величина се нарича ИЗМЕРВАНЕ! Опонентът се оборва с ФАКТИ, а не с ЕПИТЕТИ!


Съб Фев 07, 2015 9:56 am
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 16 мнения ]  Отиди на страница 1, 2  Следваща

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 15 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни