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

 
 
> 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, 14:27
Сообщение #2


Гуру
******

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



когда вы объявляется
my_str * str;

str - это указатель на структуру, на место в памяти где она лежит, но сам по себе указатель ничто, структуры нет.

my_str str;

так вы создадите структуру и сможете обращаться к ее полям как str.field, то есть через точку.

далее можно сделать указатель my_str *str2 = &str;
и уже обращаться к полям через стрелку
str2->field, при это такое обращение будет к полю именно первой структуры str.


структуры периферии проца описаны через указатели так (условно)

GPIO_STR *PORT1 = (GPIO_STR *) 0x434002300;
потому что в памяти уже есть данные лежащие как поля в структуре, это собственно регистры управляющие периферией, и вы создаете явный указатель на эту область памяти

Цитата
Простите, но я вас немного не понял. Если можете, ткните носом в статейку, где можно про это почитать, что бы вас не утруждать


есть разное выравнивание памяти, и иногда структура вида
struct...
{
char field1;
char field2;
}

может быть в памяти представлена 2 байтами, лежащими друг за другом, а может 8 байтами, где в 0 лежит field1, потом 3 байта пропуска, и в 4 лежит filed2. Это сделано потому что некоторые процы умеют брать данные только 32 битными или 16 битными словами, и в принципе не могут обращаться в области памяти с адресами не кратными их размеру слова.

так вот есть специальные слова позволяющие подсказывать как создавать структуру, типа __packed




Цитата
По-моему вы ошиблись=)


он не ошибся, он заменил указатель структуры на экземпляр

type1_t main_var;
вместо ваших
type1_t *main_var;

и соответственно вызовы через стрелку на вызовы через точку.

а также добавил функцию обработки данных структуры через указатель...

И в целом это все не относиться к кейлу или арму, это вообще вопросы базового знания языка С....
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
|- - 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.   о том вроде и беседуем... Вы уверены что все про...   May 11 2014, 20:55
|- - jcxz   Хм... Я разве где-то подобное говорил?? Я вообще-т...   May 12 2014, 03:56
- - 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 Текстовая версия Сейчас: 21st July 2025 - 17:15
Рейтинг@Mail.ru


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