С компьютера по RS485 связываюсь с микроблейзом.
Послеприема кадра в байтовый буфер(прием, проверка контрольной суммы) передаю указатель в функцию разбора
Код
void exec_ssp_read(u8 *parameter)
{
u8 tmp_buf[2];
unsigned long addr;
addr = *((unsigned long*)parameter);
if (addr == GET_ORIENT_ADDR)
{
tmp_buf[0] = SSP_ACK;
tmp_buf[1] = one_shot();
send_char_array_0(&tmp_buf[0], 2);
return;
}
exec_ssp_nak_incorrect();
return;
}
Константа для сравнения определена
#define GET_ORIENT_ADDR ((unsigned long)0x00000001)В отладчике видно что и переменная addr (рис. addr.PNG) и константа GET_ORIENT_ADDR(const.PNG) равны 1.
Но функция обходит скобки и уходит на exec_ssp_nak_incorrect().
Прямое сравнение
if (addr == (u32) 0x00000001); работает.
При работе с ARM(SAM7S, IAR - не помню какой, лет 7 назад) я встречал случаи, что
addr = *((unsigned long*)parameter); не работает если указатель на char не выровнен на двойное слово.
Можно предположить что отладчик и компилятор Eclipse работают по разному, но думаю, что ответ проще.
На сколько я помню, создавал в Визарде микроблейз с
little endian расположением, но попробовал найти как это проверить и не нашел. Параметры синтеза и включаемых модулей в ядро есть, а "с какого гонца разбивать яйца" - нету.
Прикладываю еще рисунок expression.PNG в котором видно что в буфере данные
little endian.
Эскизы прикрепленных изображений
Прикрепленные изображения