У меня есть два typedef struct
, как показано ниже:STM32F105, рука-ни-EABI-НКУ, Contiki: Хранение поплавок в STRUCT и печати поплавка в C не удается
typedef struct{
UInt32 length;
void* data;
UInt16 value;
} my_type;
typedef struct{
UInt8 type;
UInt32 length;
void* value;
} tlv_t;
То, что я пытаюсь дальше, чтобы выделить память для my_type
struct, a tlv_t
объект, который указан с созданного объекта my_type
и для числа с плавающей точкой, на которое указывает объект tlv_t
.
Если я выполняю код без последней строки кода ниже, он работает хорошо. Я могу сохранить значение, и я могу получить к нему доступ.
Но как только я попытаюсь получить к нему доступ во второй раз, загруженный код больше не работает на базе STM32F105 Contiki. Нечетная часть состоит в том, что это только в случае использования чисел с плавающей запятой. Никаких проблем с другими типами данных, например int
. К сожалению, мне действительно нужно использовать float
... Что я делаю неправильно?
Другая проблема заключается в том, что printf
не поддерживает некоторые флаги, такие как %f
или %ul
. Кто-нибудь знает, как добавить поддержку в Contiki?
my_type* t = malloc(sizeof(my_type));
t->data = malloc(sizeof(tlv_t));
tlv_t* tv = t->data;
tv->type = 10;
tv->length = sizeof(float);
tv->value = malloc(sizeof(float));
*(float*) tv->value = 212.32;
printf("tv->value: %i\n", (int) *(float*) tv->value);
printf("tv->value: %i\n", (int) *(float*) tv->value); // without this line it is working
EDIT:
Я забыл добавить эти: определений типов
typedef unsigned char UInt8;
typedef unsigned short UInt16;
typedef unsigned long UInt32;
EDIT2: Вот полный код:
#include <contiki.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <cfs/cfs.h>
#include <cfs/cfs-coffee.h>
#include "arg.h"
/*---------------------------------------------------------------------------*/
PROCESS(main_process, "Contiki CLV build015_1");
AUTOSTART_PROCESSES(&main_process);
/*---------------------------------------------------------------------------*/
PROCESS_THREAD(main_process, ev, data)
{
PROCESS_BEGIN();
my_type* t = malloc(sizeof(my_type));
t->data = malloc(sizeof(tlv_t));
tlv_t* tv = t->data;
tv->type = 10;
tv->length = sizeof(float);
tv->value = malloc(sizeof(float));
*(float*) tv->value = 212.32;
printf("tv->value: %i\n", (int) *(float*) tv->value);
printf("tv->value: %i\n", (int) *(float*) tv->value); // without this line it is working
while (1) {
PROCESS_YIELD();
}
PROCESS_END();
}
EDIT3:
Я использую новейшую версию arm-none-eabi-gcc (версия 4_8-2013q4-20131204). Существуют ли какие-либо известные проблемы при работе с структурами, поплавками или управлением памятью?
В 3d строке 'tlv_t * ТВ = t-> данных;' 't- > data - это void pntr' и 'tv указывает на tlv_t'. Вы должны сделать tlv_t * tv = (tlv_t *) t-> data; '. –
У вас, вероятно, поврежден стек где-то еще в вашем коде. – Marian
Этот код отлично работает, если вы заменили 'Uint8' на' uint8_t' (то же самое для 'Uint32') из stdint.h и скомпилируете с gcc на ubuntu. Беда, кажется, исходит из других мест. Не могли бы вы напечатать 'sizeof (float)' и 'sizeof (int)'? – francis