| Автор |
Съобщение |
|
showMANiak
Ранг: Минаващ
Регистриран на: Сря Сеп 16, 2009 7:30 pm Мнения: 28
|
 Странно поведение на функция GNU-C
За много години на всички  .Много здраве и щастие  Къде бъркам,че тая функция извикана със следните параметри да връща 0xC5 , вместо 0x67 (толкова е UBRR за 16MHz и 9600bps)?
|
| Чет Яну 01, 2015 10:37 pm |
|
 |
|
3aek
Ранг: Форумен бог
Регистриран на: Вто Яну 10, 2006 2:40 pm Мнения: 2258
|
 Re: Странно поведение на функция GNU-C
я пак, функция void какво да връща?
|
| Чет Яну 01, 2015 11:29 pm |
|
 |
|
showMANiak
Ранг: Минаващ
Регистриран на: Сря Сеп 16, 2009 7:30 pm Мнения: 28
|
 Re: Странно поведение на функция GNU-C
Не се изказах правилно.Правилният въпрос е,защо присвоява на нещо си (в случая регистъра на серийния порт) грешна стойност?.Ясно е,че void няма как да връща нещо 
|
| Чет Яну 01, 2015 11:37 pm |
|
 |
|
Cino
Ранг: Новодошъл
Регистриран на: Чет Окт 02, 2008 10:24 pm Мнения: 105
|
 Re: Странно поведение на функция GNU-C
така е защото (16*BAUDR) е 16 битов резултат кастни то uint32 във скобите
|
| Чет Яну 01, 2015 11:39 pm |
|
 |
|
showMANiak
Ранг: Минаващ
Регистриран на: Сря Сеп 16, 2009 7:30 pm Мнения: 28
|
 Re: Странно поведение на функция GNU-C
Точно в 10-ката  .Не се бях сетил за това. Благодаря 
|
| Чет Яну 01, 2015 11:57 pm |
|
 |
|
CALL-151
Ранг: Минаващ
Регистриран на: Пон Дек 12, 2005 3:30 pm Мнения: 13 Местоположение: SOFIA
|
 Re: Странно поведение на функция GNU-C
защо не напишеш:
UBRR=FCPU/16/BAUDR-1;
така избягваш големия междинен резултат от умножението.
Отделно за къкъв процесор е това gcc че int-а му е 16bit?
|
| Вто Фев 03, 2015 7:41 pm |
|
 |
|
Gogo
Ранг: Форумен бог
Регистриран на: Чет Фев 24, 2005 11:41 pm Мнения: 1049 Местоположение: Pz
|
 Re: Странно поведение на функция GNU-C
Аз ползвам това. Няма голям междинен резултат и е по-точно.
|
| Сря Фев 04, 2015 9:13 am |
|
 |
|
marcuka68
Ранг: Ориентиран
Регистриран на: Пет Авг 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 |
|
 |
|
ike
Ранг: Форумен бог
Регистриран на: Пет Фев 04, 2005 9:59 pm Мнения: 6019 Местоположение: София
|
 Re: Странно поведение на функция GNU-C
Обикновенно при микроконтролерите се ползва една скорост или 9600 или 115200. Като набиеш изчислението в макрос, компилатора го изчислява по време на компилирането и не заема никаква памет или процесорно време.
_________________ Warriors of the Night, ASSEMBLER!!!
|
| Пет Фев 06, 2015 3:33 pm |
|
 |
|
marcuka68
Ранг: Ориентиран
Регистриран на: Пет Авг 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 |
|
 |
|
syscop
Ранг: Форумен бог
Регистриран на: Пет Юни 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 |
|
 |
|
marcuka68
Ранг: Ориентиран
Регистриран на: Пет Авг 07, 2009 4:58 pm Мнения: 273
|
 Re: Странно поведение на функция GNU-C
За кои операции се генерира код и за кой не? Къде е описано това нещо?
|
| Пет Фев 06, 2015 11:11 pm |
|
 |
|
syscop
Ранг: Форумен бог
Регистриран на: Пет Юни 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 |
|
|