Микроконтролери и електроника
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 ]
Заглавие:  Каква е тая тъпотия??

Скъса ми нервичките направо :evil:

Значи постановката е: компилатор ХС32 1.32 върху PIC32MX150
Съществува един статично обявен глобален масив от тип (unsigned char).
Има също една глобална променлива pData от тип (unsigned char *) която винаги сочи някъде вътре в тоя масив на валидна позиция.

Също е важно да се знае следната дефиниция:
Код:
typedef struct {
    unsigned int id;    /* data element id (see explanation below) */
    unsigned int len;   /* data length in bytes */
} f_data_t;


Изпълнението безусловно гърми на тоя ред:
Код:
((f_data_t *)pData)->id=id;


При това гърми така яко при дебъг, че само рестарт на мплаба го оправя.

Същия код, компилиран и изпълнен в 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 можеш да го хванеш с кода, който например използвам:
Цитат:
const static char *szException[] = {
"Interrupt", // 0
"Unknown", // 1
"Unknown", // 2
"Unknown", // 3
"Address error exception (load or ifetch)", // 4
"Address error exception (store)", // 5
"Bus error (ifetch)", // 6
"Bus error (load/store)", // 7
"Syscall", // 8
"Breakpoint", // 9
"Reserved instruction", // 10
"Coprocessor unusable", // 11
"Arithmetic overflow", // 12
"Trap (possible divide by zero)", // 13
"Unknow", // 14
"Unknow", // 15
"Implementation specific 1", // 16
"CorExtend Unuseable", // 17
"Coprocessor 2" // 18
};

volatile static unsigned int codeException;
volatile static unsigned int addressException;

// _general_exception_handler() function overrides the normal
// _weak_ generic handler
void __attribute__((nomips16)) _general_exception_handler(void) {
const char *pszExcept;

asm volatile("mfc0 %0,$13" : "=r" (codeException));
asm volatile("mfc0 %0,$14" : "=r" (addressException));

// Examine codeException to identify the type of exception
// Examine addressException to find the address that caused the exception
codeException = (codeException & 0x0000007C) >> 2;
if( codeException < 19 ) {
pszExcept = szException[codeException];
mprintf("\nException '%s' happen at address %.4X",
pszExcept,
addressException );
}

while( 1 ) { }
}


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: побързах да се самозалъжа :D
Пак гърми гадта...
Ексепшъна е като за глешка при подравняването, а адресът на ексепшъна странно обаче е подравнен

Автор:  Цецо [ Нед Юли 27, 2014 12:46 pm ]
Заглавие:  Re: Каква е тая тъпотия??

Добре де, нали Владо ти е дал атрибутите за подравняване и пакетиране? Тоя компилатор на Микрочип нали е с gcc ядро, значи ги подържа. И да не е, някъде там в документацията има как се да подравняваш данните по твой вкус, всички компилатори го имат, дали ще е __atribute или #pragma някаква....

Автор:  Н'бабане Гт'муан'га [ Пон Юли 28, 2014 2:33 am ]
Заглавие:  Re: Каква е тая тъпотия??

В крайна сметка се оправих. Проблемът се оказа не подравняването, а следния ред:

Код:
double v=(double)*((long double *)p);


където 'p' е от тип (unsigned char *) и сочи вътре в масива към данни от тип (long double).
Така и не разбрах защо XC32 гърми на това, но когато промених прехвърлянето да е с memcpy() всичко си тръгна както си му е редът.

Автор:  Цецо [ Пон Юли 28, 2014 8:37 am ]
Заглавие:  Re: Каква е тая тъпотия??

Ами тука май също може да имаш ядове с подравняване.

Автор:  Н'бабане Гт'муан'га [ Пон Юли 28, 2014 11:47 am ]
Заглавие:  Re: Каква е тая тъпотия??

Цецо написа:
Ами тука май също може да имаш ядове с подравняване.


Правилно. Важното е, че поне изкопах грешката защото вече бях побеснял (тъпи >8-битови архитектури... :evil: )

Автор:  Цецо [ Пон Юли 28, 2014 11:59 am ]
Заглавие:  Re: Каква е тая тъпотия??

Мен лично ме ужасява мисълта да се налага да "чета" код в, който се прави кастване от ( unsigned char* ) в ( long double* )

Нищо лично, аз съм човек със скромен програмистки опит. Но според мен проблема ти не е в архитектурата нито в компилатора, просто стила ти на писане е като за Matlab :)

Автор:  Н'бабане Гт'муан'га [ Пон Юли 28, 2014 3:55 pm ]
Заглавие:  Re: Каква е тая тъпотия??

Цецо написа:
Мен лично ме ужасява мисълта да се налага да "чета" код в, който се прави кастване от ( unsigned char* ) в ( long double* )

Нищо лично, аз съм човек със скромен програмистки опит. Но според мен проблема ти не е в архитектурата нито в компилатора, просто стила ти на писане е като за Matlab :)


Стилът на писане зависи от безброй фактори, един от които е естеството на проблема. Аз лично не бих скочил с двата крака в прибързани заключения... :)

Страница 1 от 2 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/