реклама на сайте
подробности

 
 
> Keil. Не работает код, typedef struct
MySOL
сообщение May 11 2014, 13:41
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 67
Регистрация: 17-06-12
Пользователь №: 72 370



Здравствуйте, товарищи! Прошу помочь разобраться в проблеме. Сам новичок и для написания программы решил разобраться в такой теме как "typedef struct", которая очень полезна при реализации различных интерфейсов (spi, ethernet и прочее). Написал простенькую программу, дабы протестировать и найти возможные подводные камни. Код следующий
Код
void f1(uint16_t *f1_var1);

typedef struct type1                          
{
    uint8_t var1;
    uint8_t var2;
} type1_t;

int __main(void)
{
        type1_t *main_var;                
    
        main_var->var1    =    0xFF;        
        main_var->var2    =    0xFF;

    f1((uint16_t*)main_var);

}

void f1(uint16_t *f1_var1)
{
    *f1_var1    =    *f1_var1>>1;
}


Суть программы заключается в формировании пакета данных, состоящего из двух наборов данных (в данном случае var1 и var2) формата uint8_t вызов функции, которая эти данные обрабатывает.
Проблема заключается в том, что данные 0xFF не записываются в var1 и var2. С чем это связанно не знаю. Тут значения переменных на этапах отладки
Прикрепленное изображение

Прикрепленное изображение

Прикрепленное изображение

Прикрепленное изображение


Прикрепленное изображение

Прошу помочь с проблемой.

Сообщение отредактировал MySOL - May 11 2014, 13:42
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Golikov A.
сообщение May 11 2014, 20:55
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



о том вроде и беседуем...

Вы уверены что все проекты что вы создаете в кейле или других средах, под разные процы по умолчанию упакованы до байта, перефразирую, уверены что нигде не задается метод пакования отличный от побайтно?

А вы уверены что упакованные 6 байтные структуры идут в памяти через 6 байт на всех типах процов?

Go to the top of the page
 
+Quote Post
jcxz
сообщение May 12 2014, 03:56
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Хм... Я разве где-то подобное говорил??
Я вообще-то говорил почти противоположное:
1. Структуры в си по умолчанию не упакованные.
2. Выравнивание структуры равно выравниванию максимального члена структуры.
3. Максимальное выравнивание для встроенных типов данных как правило не превышает основной разрядности CPU (хотя это не могу утверждать с полной уверенностью).
(т.е. - если CPU 32-разрядный, то выравнивание 64-битного встроенного типа будет всё равно ==32).

Про упакованность - тоже Вы что-то не поняли. Я как раз писал, что пакование может выполняться не обязательно до уровня байт, может быть до уровня 16-бит или др.
см. #pragma pack(push, N) в IAR к примеру. Пример IAR:
#pragma pack(push, 2)
struct T {
u32 a;
u8 b;
};
#pragma pack(pop)
В данной структуре будет sizeof(T)==6. И выравнивание её будет равно ==16бит.

И вообще - упаковка не входит в язык си и может выполняться по-разному на разных компиляторах.

Цитата(Golikov A. @ May 12 2014, 02:55) *
А вы уверены что упакованные 6 байтные структуры идут в памяти через 6 байт на всех типах процов?

Очевидно, что в си, если имеется структура (не важно - пакованная или нет), то в массиве элементов этой структуры начало каждого следующего элемента будет
находиться по смещению sizeof() от предыдущего. А вот уже величина этого sizeof(T) будет зависеть от наличия pack() в её атрибутах и величины пакования этого самого pack().
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- MySOL   Keil. Не работает код   May 11 2014, 13:41
- - Палыч   Вы забыли свою структуру где либо разместить (выде...   May 11 2014, 13:55
|- - MySOL   Цитата(Палыч @ May 11 2014, 17:55) Вы заб...   May 11 2014, 14:13
- - kolobok0   Цитата(MySOL @ May 11 2014, 17:41) .. Про...   May 11 2014, 14:00
- - KnightIgor   Кодtypedef struct type1 { uint8_t var1; ...   May 11 2014, 14:03
- - Golikov A.   когда вы объявляется my_str * str; str - это указ...   May 11 2014, 14:27
|- - MySOL   Цитата(Golikov A. @ May 11 2014, 18:27) ....   May 11 2014, 16:55
- - Golikov A.   Выравнивание - с этим ничего не сделаешь, с этим н...   May 11 2014, 17:02
|- - jcxz   Не очень понял как мешает выравнивание структуре ...   May 11 2014, 18:17
- - Golikov A.   да..., вот потому и хорошо даже для себя много раз...   May 11 2014, 18:49
|- - jcxz   Цитата(Golikov A. @ May 12 2014, 00:49) s...   May 11 2014, 19:20
- - Golikov A.   Что-то я совсем потерялся.... Что в процах с 32 б...   May 12 2014, 04:40
|- - Сергей Борщ   Цитата(Golikov A. @ May 12 2014, 07:40) А...   May 12 2014, 06:07
|- - jcxz   Цитата(Golikov A. @ May 12 2014, 10:40) Ч...   May 12 2014, 07:01
- - Golikov A.   ЦитатаВы почему-то путаете не выровненный доступ C...   May 12 2014, 07:56
|- - jcxz   Цитата(Golikov A. @ May 12 2014, 13:56) Ч...   May 12 2014, 08:17
- - Golikov A.   Кодstruct __packed str { char A; char B; } ...   May 12 2014, 09:28
|- - jcxz   Да какое тут 32-битное выравнивание??? Кроме 32-би...   May 12 2014, 11:14
|- - Сергей Борщ   Цитата(Golikov A. @ May 12 2014, 12:28) ч...   May 12 2014, 11:18
- - Golikov A.   Ладно, сдаюсь... все всегда будет работать хорошо,...   May 12 2014, 11:42
- - Belikov_lp   Алгоритмы не пробовал добавлять?   May 18 2014, 03:42


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th July 2025 - 14:37
Рейтинг@Mail.ru


Страница сгенерированна за 0.01426 секунд с 7
ELECTRONIX ©2004-2016