Отговори на тема  [ 20 мнения ]  Отиди на страница 1, 2  Следваща
Каква е тая тъпотия?? 
Автор Съобщение
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Яну 25, 2012 9:14 am
Мнения: 5298
Мнение Каква е тая тъпотия??
Скъса ми нервичките направо :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 си е бетон.
Просто блокирах на това... Някой да помогне с идея?

_________________
'просто' е технически синоним на 'красиво'


Съб Юли 26, 2014 12:26 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Вто Юли 31, 2007 2:55 pm
Мнения: 1792
Местоположение: София
Мнение Re: Каква е тая тъпотия??
Най-вероятно подравняване (alignment).

EDIT: Виж това "pData" преди да гръмне дали е подравнено на 4. Ако не, най-вероятно генерираш и exception по случая.


Съб Юли 26, 2014 12:46 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Яну 25, 2012 9:14 am
Мнения: 5298
Мнение Re: Каква е тая тъпотия??
А, може да е това!
pData адрес .....833, демек няма подравняване. Има ли някаква специална опция за ХС32 дето да му кажа че не искам да ми подравнява данните?

_________________
'просто' е технически синоним на 'красиво'


Съб Юли 26, 2014 12:52 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Вто Юли 31, 2007 2:55 pm
Мнения: 1792
Местоположение: София
Мнение Re: Каква е тая тъпотия??
Ти всъщност искаш подравняване, M4K друго не разбира.
Просто си подравни глобалния масив:

https://gcc.gnu.org/onlinedocs/gcc/Vari ... butes.html


Съб Юли 26, 2014 12:58 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Фев 25, 2005 1:58 pm
Мнения: 4585
Местоположение: US
Мнение 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 гърми ли кода, пробвал ли си там ?

_________________
Ето аз дишам, работя, живея и програми пиша тъй както умея, с проца под вежди се гледаме строго и боря се с него доколкото мога....


Съб Юли 26, 2014 3:12 pm
Профил WWW
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Яну 25, 2012 9:14 am
Мнения: 5298
Мнение Re: Каква е тая тъпотия??
Мерси, ще го пробвам.
В CodeBlocks съм с тоя дето си идва с него - GCC 4.8.1
Пробвал съм и с С32 2.02 - същата работа засега.

_________________
'просто' е технически синоним на 'красиво'


Нед Юли 27, 2014 1:42 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Сеп 26, 2004 4:11 pm
Мнения: 3750
Местоположение: София
Мнение Re: Каква е тая тъпотия??
Подравняване, което "почти" не зависи от компилатора можеш да направиш, ако декларираш union, като единият мембър ти е напр. long, другият е твоят масив. За да не пишеш всеки път my_union.my_array[x] може да напишеш макрос
#define array my_union.my_array


Нед Юли 27, 2014 9:01 am
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Фев 26, 2006 6:52 pm
Мнения: 11266
Местоположение: Добрич
Мнение Re: Каква е тая тъпотия??
Това дали да гърми или да не гърми при неподравнен достъп си е изцяло функция на ядрото, която предполагам може да се включва и изключва. Поне при някои други архитектури е така.
Компилаторите нямат пръст в тая работа (освен ако не очаквате компилаторът да ви настрои всичко, да изпере, изчисти и да сготви...)
По-скоро компилаторът може да генерира различен (8/16/32) код за достъп според указанията на задклавиатурното устройство. Единият начин е с макроси, другият е с атрибути на променливата/секцията...


Нед Юли 27, 2014 9:44 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Яну 25, 2012 9:14 am
Мнения: 5298
Мнение Re: Каква е тая тъпотия??
Току що пробвах метода на батето и е пушка.
Голямо благодаря от мен за идеята!

Edit: побързах да се самозалъжа :D
Пак гърми гадта...
Ексепшъна е като за глешка при подравняването, а адресът на ексепшъна странно обаче е подравнен

_________________
'просто' е технически синоним на 'красиво'


Нед Юли 27, 2014 9:54 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пон Сеп 27, 2004 9:22 am
Мнения: 15501
Местоположение: София
Мнение Re: Каква е тая тъпотия??
Добре де, нали Владо ти е дал атрибутите за подравняване и пакетиране? Тоя компилатор на Микрочип нали е с gcc ядро, значи ги подържа. И да не е, някъде там в документацията има как се да подравняваш данните по твой вкус, всички компилатори го имат, дали ще е __atribute или #pragma някаква....

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


Нед Юли 27, 2014 12:46 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Яну 25, 2012 9:14 am
Мнения: 5298
Мнение Re: Каква е тая тъпотия??
В крайна сметка се оправих. Проблемът се оказа не подравняването, а следния ред:

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


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

_________________
'просто' е технически синоним на 'красиво'


Пон Юли 28, 2014 2:33 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пон Сеп 27, 2004 9:22 am
Мнения: 15501
Местоположение: София
Мнение Re: Каква е тая тъпотия??
Ами тука май също може да имаш ядове с подравняване.

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


Пон Юли 28, 2014 8:37 am
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Яну 25, 2012 9:14 am
Мнения: 5298
Мнение Re: Каква е тая тъпотия??
Цецо написа:
Ами тука май също може да имаш ядове с подравняване.


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

_________________
'просто' е технически синоним на 'красиво'


Пон Юли 28, 2014 11:47 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пон Сеп 27, 2004 9:22 am
Мнения: 15501
Местоположение: София
Мнение Re: Каква е тая тъпотия??
Мен лично ме ужасява мисълта да се налага да "чета" код в, който се прави кастване от ( unsigned char* ) в ( long double* )

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

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


Пон Юли 28, 2014 11:59 am
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Яну 25, 2012 9:14 am
Мнения: 5298
Мнение Re: Каква е тая тъпотия??
Цецо написа:
Мен лично ме ужасява мисълта да се налага да "чета" код в, който се прави кастване от ( unsigned char* ) в ( long double* )

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


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

_________________
'просто' е технически синоним на 'красиво'


Пон Юли 28, 2014 3:55 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 20 мнения ]  Отиди на страница 1, 2  Следваща

Кой е на линия

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


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

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