Free soft для ембеддера
09.06.2014, 12:32
|
|
|
Прописка
Регистрация: 17.08.2013
Сообщений: 282
Сказал спасибо: 10
Сказали Спасибо 4 раз(а) в 4 сообщении(ях)
|
Re: Free soft для ембеддера
При чем тут знаю я основы языка или нет? Пишите фигню всякую, такто...
Кстати, пробовал такую штуку:
union f {ulong up; ulong ul;} g;
g.ul=g.up;
Данные присваиваются и не портятся.
Приделываю туда 4 байта массив - не хочет.
Случайными данными заполняется...
|
|
|
|
09.06.2014, 14:00
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,684
Сказал спасибо: 116
Сказали Спасибо 823 раз(а) в 597 сообщении(ях)
|
Re: Free soft для ембеддера
optical illusion, так что с ассемблерным кодом-то получается?
Вы бы проверили, а то у меня вот такой код
|
Код:
|
typedef union{
unsigned long L;
char C[4];
} LC;
...
LC lc;
...
lc.L = 0xabcd;
lc.C[0] = 0xa;
lc.C[3] = 0xd; |
выдает черт-те что:
|
Код:
|
; main.c: 300: lc.L = 0xabcd;
ldw x, sp
addw x, #8
ldw y, #0xabcd
ldw (0x2, x), y
clr (0x1, x)
clr (x)
; main.c: 301: lc.C[0] = 0xa;
ldw x, sp
ld a, #0x0a
ld (8, x), a
; main.c: 302: lc.C[3] = 0xd;
ldw x, sp
ld a, #0x0d
ld (11, x), a |
Может, вам просто обойтись без union? Скажем, так:
|
Код:
|
char C[4];
unsigned long *p = C; |
?
(только нужно разобраться с endianness)
P.S. Надо по поводу union читать мануал по sdcc, но влом.
P.P.S А еще sdcc не знает про #pragma pack
__________________
Если ты пользуешься Windows, то ты финансируешь мировой терроризм!
|
|
|
|
09.06.2014, 14:21
|
|
|
Гражданин KAZUS.RUN
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
|
Re: Free soft для ембеддера
Сообщение от optical illusion
|
При чем тут знаю я основы языка или нет? Пишите фигню всякую, такто... 
Кстати, пробовал такую штуку:
union f {ulong up; ulong ul;} g;
g.ul=g.up;
Данные присваиваются и не портятся.
Приделываю туда 4 байта массив - не хочет.
Случайными данными заполняется...
|
Любой компилятор, с любой оптимизацией эту строку выкинет, как бессмысленную. Именно это и показывает, что вы совершенно не понимаете что вы пишете. q.ul ВСЕГДА БУДЕТ РАВЕН g.up. Так как это ОДИН И ТОТ ЖЕ ОБЪЕКТ под разными именами. union ничего не делает, как вы не поймёте простой вещи.
Напишите, что по вашему работает не так. А то не понятно, что вы хотите сделать и что именно у вас получается не так
|
|
|
|
09.06.2014, 14:44
|
|
|
Прописка
Регистрация: 17.08.2013
Сообщений: 282
Сказал спасибо: 10
Сказали Спасибо 4 раз(а) в 4 сообщении(ях)
|
Re: Free soft для ембеддера
Нужно так:
union f {uchar t[4]; ulong ul;} g;
g.ul=0;
g.t[0]=0;
g.t[1]=byte3;
g.t[2]=byte2;
g.t[3]=byte1;
такой вот комбинацией заменяю:
ulong gh;
gh=0;
gh=gh+byte3;
gh=gh‹‹8;
gh=gh+byte2;
gh=gh‹‹8;
gh=gh+byte1;
Работает, но union то как использовать? 
Мне union нужен...
|
|
|
|
09.06.2014, 14:47
|
|
|
Прописка
Регистрация: 17.08.2013
Сообщений: 282
Сказал спасибо: 10
Сказали Спасибо 4 раз(а) в 4 сообщении(ях)
|
Re: Free soft для ембеддера
Сообщение от eddy
|
|
Надо по поводу union читать мануал по sdcc, но влом.
|
Там ничего нет у них про union.
|
|
|
|
09.06.2014, 14:49
|
|
|
Прописка
Регистрация: 17.08.2013
Сообщений: 282
Сказал спасибо: 10
Сказали Спасибо 4 раз(а) в 4 сообщении(ях)
|
Re: Free soft для ембеддера
Сообщение от SasaVitebsk
|
|
q.ul ВСЕГДА БУДЕТ РАВЕН g.up
|
Это всем понятно. Но когда две long, то работает, а когда использую массив - тоже 4 байте - ТО НЕ РАБОТАЕТ. Это понятно?
|
|
|
|
09.06.2014, 15:10
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 24.03.2007
Сообщений: 1,394
Сказал спасибо: 85
Сказали Спасибо 672 раз(а) в 392 сообщении(ях)
|
Re: Free soft для ембеддера
а функция sizeof(g) для вашего юниона какой размер возвращает?
|
|
|
|
09.06.2014, 15:41
|
|
|
Прописка
Регистрация: 17.08.2013
Сообщений: 282
Сказал спасибо: 10
Сказали Спасибо 4 раз(а) в 4 сообщении(ях)
|
Re: Free soft для ембеддера
Запустил строки:
tu9=sizeof(g);
sprintf (buf,"sizeof %d ", tu9);
Напечатало: sizeof 0
Хотя, пробовал подставлять другие массивы, тоже самое печатает -0.
Последний раз редактировалось optical illusion; 09.06.2014 в 15:54.
|
|
|
|
09.06.2014, 15:42
|
|
|
Гражданин KAZUS.RUN
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
|
Re: Free soft для ембеддера
Сообщение от optical illusion
|
ulong gh;
gh=0;
gh=gh+byte3;
gh=gh‹‹8;
gh=gh+byte2;
gh=gh‹‹8;
gh=gh+byte1;
Работает, но union то как использовать? 
Мне union нужен...
|
Давайте без обид. Смысл в том, что мы все заблуждаемся на разных этапах своей жизни. В большей или меньшей степени. И я не исключение. Поэтому воспринимайте мои сообщения, равно как и других, как желание помочь.
Разберём вторую часть марлезонского балета.
Для того, чтобы писать хорошо на языке высокого уровня, необходимо представлять, во что ваш текст превратится.
Ваша прога абсолютно эквивалентна:
gh=0;
gh |= byte3‹‹16;
gh |= byte2‹‹8;
gh |= byte1;
С одной стороны вроде бы написано одно и тоже. Но в моём случае компилятор просто положит твои byte в память. В твоём, при низкой оптимизации, или если объявить переменную volatile, компилятор сначала byte3 положит нулевым байтом, потом перешлёт в первый байт, а нулевым положит byte2 ну и так далее. Ради интереса проверь результат работы обоих программ и после этого объём скомпилированного кода.
|
Цитата:
|
Нужно так:
union f {uchar t[4]; ulong ul;} g;
g.ul=0;
g.t[0]=0;
g.t[1]=byte3;
g.t[2]=byte2;
g.t[3]=byte1;
|
Теперь по первой части марлезонского балета.
Третий раз повторяю что результат будет зависеть от того, как твой компилятор хранит long переменные. Это должно выставляться в настройках компилятора.
Сейчас, фактически дефакто, используется формат Endian Mode = Little. Что означает "младшим байтом вперёд".
Если исходить из этого, то твоя прога, аналогичная верхней, в виде union должна выглядеть так:
g.t[0]=byte1;
g.t[1]=byte2;
g.t[2]=byte3;
g.t[3]=0;
если старшим, то
g.t[0]=0;
g.t[1]=byte3;
g.t[2]=byte2;
g.t[3]=byte1;
g.ul=0; бессмысленная операция
|
|
|
|
09.06.2014, 15:53
|
|
|
Прописка
Регистрация: 17.08.2013
Сообщений: 282
Сказал спасибо: 10
Сказали Спасибо 4 раз(а) в 4 сообщении(ях)
|
Re: Free soft для ембеддера
Сообщение от SasaVitebsk
|
|
"младшим байтом вперёд"
|
Очень смешно...
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 04:33.
|
|