| Микроконтролери и електроника http://mcu-bg.com/mcu_site/ |
|
| Каква е тая тъпотия?? http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=13094 |
Страница 1 от 2 |
| Автор: | Н'бабане Гт'муан'га [ Съб Юли 26, 2014 12:26 pm ] | ||||||||||||||||||
| Заглавие: | Каква е тая тъпотия?? | ||||||||||||||||||
Скъса ми нервичките направо Значи постановката е: компилатор ХС32 1.32 върху PIC32MX150 Съществува един статично обявен глобален масив от тип (unsigned char). Има също една глобална променлива pData от тип (unsigned char *) която винаги сочи някъде вътре в тоя масив на валидна позиция. Също е важно да се знае следната дефиниция:
Изпълнението безусловно гърми на тоя ред:
При това гърми така яко при дебъг, че само рестарт на мплаба го оправя. Същия код, компилиран и изпълнен в CodeBlocks си е бетон. Просто блокирах на това... Някой да помогне с идея? |
|||||||||||||||||||
| Автор: | woody [ Съб Юли 26, 2014 12:46 pm ] |
| Заглавие: | Re: Каква е тая тъпотия?? |
Най-вероятно подравняване (alignment). EDIT: Виж това "pData" преди да гръмне дали е подравнено на 4. Ако не, най-вероятно генерираш и exception по случая. |
|
| Автор: | Н'бабане Гт'муан'га [ Съб Юли 26, 2014 12:52 pm ] |
| Заглавие: | Re: Каква е тая тъпотия?? |
А, може да е това! pData адрес .....833, демек няма подравняване. Има ли някаква специална опция за ХС32 дето да му кажа че не искам да ми подравнява данните? |
|
| Автор: | woody [ Съб Юли 26, 2014 12:58 pm ] |
| Заглавие: | Re: Каква е тая тъпотия?? |
Ти всъщност искаш подравняване, M4K друго не разбира. Просто си подравни глобалния масив: https://gcc.gnu.org/onlinedocs/gcc/Vari ... butes.html |
|
| Автор: | ¶ [ Съб Юли 26, 2014 3:12 pm ] | |||||||||
| Заглавие: | Re: Каква е тая тъпотия?? | |||||||||
Ако е exception можеш да го хванеш с кода, който например използвам:
A с CodeBlocks какъв toolchain използваш ? А с MPLAB C32 v2.xx гърми ли кода, пробвал ли си там ? |
||||||||||
| Автор: | Н'бабане Гт'муан'га [ Нед Юли 27, 2014 1:42 am ] |
| Заглавие: | Re: Каква е тая тъпотия?? |
Мерси, ще го пробвам. В CodeBlocks съм с тоя дето си идва с него - GCC 4.8.1 Пробвал съм и с С32 2.02 - същата работа засега. |
|
| Автор: | bateAz [ Нед Юли 27, 2014 9:01 am ] |
| Заглавие: | Re: Каква е тая тъпотия?? |
Подравняване, което "почти" не зависи от компилатора можеш да направиш, ако декларираш union, като единият мембър ти е напр. long, другият е твоят масив. За да не пишеш всеки път my_union.my_array[x] може да напишеш макрос #define array my_union.my_array |
|
| Автор: | miro_atc [ Нед Юли 27, 2014 9:44 am ] |
| Заглавие: | Re: Каква е тая тъпотия?? |
Това дали да гърми или да не гърми при неподравнен достъп си е изцяло функция на ядрото, която предполагам може да се включва и изключва. Поне при някои други архитектури е така. Компилаторите нямат пръст в тая работа (освен ако не очаквате компилаторът да ви настрои всичко, да изпере, изчисти и да сготви...) По-скоро компилаторът може да генерира различен (8/16/32) код за достъп според указанията на задклавиатурното устройство. Единият начин е с макроси, другият е с атрибути на променливата/секцията... |
|
| Автор: | Н'бабане Гт'муан'га [ Нед Юли 27, 2014 9:54 am ] |
| Заглавие: | Re: Каква е тая тъпотия?? |
Току що пробвах метода на батето и е пушка. Голямо благодаря от мен за идеята! Edit: побързах да се самозалъжа Пак гърми гадта... Ексепшъна е като за глешка при подравняването, а адресът на ексепшъна странно обаче е подравнен |
|
| Автор: | Цецо [ Нед Юли 27, 2014 12:46 pm ] |
| Заглавие: | Re: Каква е тая тъпотия?? |
Добре де, нали Владо ти е дал атрибутите за подравняване и пакетиране? Тоя компилатор на Микрочип нали е с gcc ядро, значи ги подържа. И да не е, някъде там в документацията има как се да подравняваш данните по твой вкус, всички компилатори го имат, дали ще е __atribute или #pragma някаква.... |
|
| Автор: | Н'бабане Гт'муан'га [ Пон Юли 28, 2014 2:33 am ] | |||||||||
| Заглавие: | Re: Каква е тая тъпотия?? | |||||||||
В крайна сметка се оправих. Проблемът се оказа не подравняването, а следния ред:
където 'p' е от тип (unsigned char *) и сочи вътре в масива към данни от тип (long double). Така и не разбрах защо XC32 гърми на това, но когато промених прехвърлянето да е с memcpy() всичко си тръгна както си му е редът. |
||||||||||
| Автор: | Цецо [ Пон Юли 28, 2014 8:37 am ] |
| Заглавие: | Re: Каква е тая тъпотия?? |
Ами тука май също може да имаш ядове с подравняване. |
|
| Автор: | Н'бабане Гт'муан'га [ Пон Юли 28, 2014 11:47 am ] | |||||||||
| Заглавие: | Re: Каква е тая тъпотия?? | |||||||||
Правилно. Важното е, че поне изкопах грешката защото вече бях побеснял (тъпи >8-битови архитектури... |
||||||||||
| Автор: | Цецо [ Пон Юли 28, 2014 11:59 am ] |
| Заглавие: | Re: Каква е тая тъпотия?? |
Мен лично ме ужасява мисълта да се налага да "чета" код в, който се прави кастване от ( unsigned char* ) в ( long double* ) Нищо лично, аз съм човек със скромен програмистки опит. Но според мен проблема ти не е в архитектурата нито в компилатора, просто стила ти на писане е като за Matlab |
|
| Автор: | Н'бабане Гт'муан'га [ Пон Юли 28, 2014 3:55 pm ] | |||||||||
| Заглавие: | Re: Каква е тая тъпотия?? | |||||||||
Стилът на писане зависи от безброй фактори, един от които е естеството на проблема. Аз лично не бих скочил с двата крака в прибързани заключения... |
||||||||||
| Страница 1 от 2 | Часовете са според зоната UTC + 2 часа [ DST ] |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|