| Микроконтролери и електроника http://mcu-bg.com/mcu_site/ |
|
| MCC18 constants declaration http://mcu-bg.com/mcu_site/viewtopic.php?f=7&t=4477 |
Страница 1 от 2 |
| Автор: | ¶ [ Пет Юли 06, 2007 9:20 pm ] | |||||||||||||||||||||||||||
| Заглавие: | MCC18 constants declaration | |||||||||||||||||||||||||||
Подразни ме следната недомислица в MCC18 3.12 на Microchip:
Горния код не иска да се компилира, плюе се следното съобщение:
Обаче, ако се напише така:
се компилира, само че излиза, че трябва константите да ги декларирам във всяка подпрограма, където ще се използват. Някой да е заобикалял този проблем ? С #define също не става, иска се непременно числена стойност. |
||||||||||||||||||||||||||||
| Автор: | HCL [ Пет Юли 06, 2007 10:33 pm ] |
| Заглавие: | |
Що не ги сметнеш е елката |
|
| Автор: | ¶ [ Пет Юли 06, 2007 10:42 pm ] | |||||||||
| Заглавие: | ||||||||||
Мразим да смятаме |
||||||||||
| Автор: | HCL [ Пет Юли 06, 2007 11:31 pm ] |
| Заглавие: | |
само за информация, в Keil проблемьт го няма. |
|
| Автор: | ¶ [ Пет Юли 06, 2007 11:41 pm ] | |||||||||
| Заглавие: | ||||||||||
Това си е бъг в MCC18 |
||||||||||
| Автор: | Gogo [ Съб Юли 07, 2007 12:08 am ] | |||||||||
| Заглавие: | ||||||||||
Е така става:
Ако Pi, cf_var1 и cf_var2 няма да ги ползваш в кода, може да не ги дефинираш като "const float" |
||||||||||
| Автор: | Цецо [ Съб Юли 07, 2007 3:05 pm ] |
| Заглавие: | |
Ами аз по принцип на всичко де що е 8-16 бита константите гледам да ги правя с #define. От опит знам, че голямо количество от компилаторите за "малки" контролери се посират в такива ситуации. |
|
| Автор: | ps66 [ Съб Юли 07, 2007 8:22 pm ] | |||||||||
| Заглавие: | ||||||||||
никога в никой компилатор не съм ползвал "const" за деклариране на константи - само #define това не виждам причина да не работи:
по-принцип "const" може да има различни интерпретации/значения на различните компилатори ... |
||||||||||
| Автор: | ¶ [ Съб Юли 07, 2007 11:56 pm ] |
| Заглавие: | |
Проблема е ясен: на дадено място в програмата няма проблеми с изчисляването на константен израз, на друго място има. #define не ги харесвам, защото често се бъркаш с какъв точно тип данни работиш. Лошото е, че и с #define не може да изчисли израза, ако декларирам константа-променлива на глобално ниво в рамките на един файл. Много малко съм използвал MCC18, мислех си, че е добър, но се оказа, че има много гювеч по него. В тоя ред мисли, да задам още една гатанка ( за мен ): как мога, в Ц програма за МЦЦ18, да си декларирам unsigned int променлива, която променлива да разположа на адреса на ADRESH:ADRESL ? Целта ми е да имам максимално бърз достъп до тези клетки, без да ми се налага да правя от два 8-битови регистъра една 16-битова unsigned int променлива [ unsigned int res16 = ((unsigned int)(ADRESH<<8 )) | ADRESL ] |
|
| Автор: | ps66 [ Нед Юли 08, 2007 5:39 am ] | ||||||||||||||||||
| Заглавие: | |||||||||||||||||||
аз в #define винаги указвам типа който да се връща, и всичко е в () за всеки случай ... при смятането на изрази винаги указвам типа на резултата (за всеки случай
това много не го схванах ... може би искаш: #define ADRES_PTR(adr) ((unsigned int *)(adr)) #define ADRES(adr) *ADRES_PTR(adr) така с: .... ADRES(12345) = 23456; unsigned int temp = ADRES(12345); // temp == 23456 на адрес 12345 ще запишеш 23456 ... от това по-бързо не се сещам а и за компилатора би трябвало да е ясно какво да прави. виж му asm кода за да прецениш ! PS: стига компилатора ти да поддържа макродефиниции |
|||||||||||||||||||
| Автор: | ¶ [ Нед Юли 08, 2007 8:53 am ] | ||||||||||||||||||
| Заглавие: | |||||||||||||||||||
С указател е ясно, че може Ето например какво излиза, когато искам да извлека резултата от АЦП-то:
Това на асемблер би станало така:
демек 4 цикъла на асемблер, 15 цикъла на Ц |
|||||||||||||||||||
| Автор: | ps66 [ Нед Юли 08, 2007 10:00 am ] | |||||||||||||||||||||||||||
| Заглавие: | ||||||||||||||||||||||||||||
от пикове не разбирам обаче не мога да разбера защо правиш сметките по-долу за res16 !?
ако целта ти е:
по-добре би било: *((unsigned char *)&res16) = ADRESL; *(((unsigned char *)&res16)+1) = ADRESH; не виждам причина от горните два реда компилатора да генерира нещо по-различно от
|
||||||||||||||||||||||||||||
| Автор: | Gogo [ Нед Юли 08, 2007 7:14 pm ] | ||||||||||||||||||
| Заглавие: | |||||||||||||||||||
За да стане това:
ползвам това:
|
|||||||||||||||||||
| Автор: | Цецо [ Пон Юли 09, 2007 8:15 am ] | ||||||||||||||||||
| Заглавие: | |||||||||||||||||||
Аз тия работи ги правя така
и после
тва ме светна някой тука във форума и все него си ползвам. На пикльовския компилер си генерира точно каквото очаквам |
|||||||||||||||||||
| Автор: | ¶ [ Пон Юли 09, 2007 5:23 pm ] | ||||||||||||||||||
| Заглавие: | |||||||||||||||||||
Бахтий компилатора, шибан Ето така става най-кратко:
Но въпреки всичко си избълва 2 ненужни инструкции movlb, явно за да си върже гащите
Все пак е вече приемливо, 6 инструкции, срещу 20-тина инструкции преди това. Мерси за идеите. |
|||||||||||||||||||
| Страница 1 от 2 | Часовете са според зоната UTC + 2 часа [ DST ] |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|