2014-01-24 7 views
1

У меня есть два 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). Существуют ли какие-либо известные проблемы при работе с структурами, поплавками или управлением памятью?

+0

В 3d строке 'tlv_t * ТВ = t-> данных;' 't- > data - это void pntr' и 'tv указывает на tlv_t'. Вы должны сделать tlv_t * tv = (tlv_t *) t-> data; '. –

+0

У вас, вероятно, поврежден стек где-то еще в вашем коде. – Marian

+0

Этот код отлично работает, если вы заменили 'Uint8' на' uint8_t' (то же самое для 'Uint32') из stdint.h и скомпилируете с gcc на ubuntu. Беда, кажется, исходит из других мест. Не могли бы вы напечатать 'sizeof (float)' и 'sizeof (int)'? – francis

ответ

0

Я предлагаю вам исправить свой код, чтобы больше не получать предупреждения о компиляторе (не выключайте их). При необходимости добавьте отливки. После того как я сделал эти исправления, ваш код работал на меня, поэтому код уродливый, но хорошо.

#define UInt32 unsigned int 
#define UInt16 unsigned short 
#define UInt8 unsigned char 

typedef struct{ 
    UInt32 length; 
    void* data; 
    UInt16 value; 
} my_type; 

typedef struct{ 
    UInt8 type; 
    UInt32 length; 
    void* value; 
} tlv_t; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    my_type* t = (my_type*)malloc(sizeof(my_type)); 
    t->data = malloc(sizeof(tlv_t)); 
    tlv_t* tv = (tlv_t*)t->data; 

    tv->type = 10; 
    tv->length = sizeof(float); 
    tv->value = malloc(sizeof(float));  
    *(float*) tv->value = (float)212.32; 


    printf("tv->value: %i\n", (int) *(float*) tv->value); 
    printf("tv->value: %i\n", (int) *(float*) tv->value); // without this line it 
    getchar(); 
} 

дает tv-> значение: 212 TV-> значение: 212

+1

Что именно вы изменили в исходном коде? –

+0

Просто добавил некоторые приведения для указателей и float-cast для присвоения 212.32. – user2668972

+0

Это не решение моей проблемы. Даже без бросков я не получаю никаких предупреждений компилятора (они включены). – raspi

1

Попробуйте

PROCESS_THREAD(main_process, ev, data) 
{ 
    static my_type *t; 
    static tlv_t *tv; 
    static float f = 212.32; 

    PROCESS_BEGIN(); 

    t = (my_type *)malloc(sizeof(my_type)); 
    t->data = malloc(sizeof(tlv_t)); 
    tv = (tlv_t *)t->data; 

    tv->type = 10; 
    tv->length = sizeof(float); 
    tv->value = malloc(sizeof(float));  
    //*(float *) tv->value = 212.32; 

    memmove(tv->value, &f, 4); 


    printf("tv->value: %i\n", (int) *(float*) tv->value); 
    printf("tv->value: %i\n", (int) *(float*) tv->value); // without this line it is working 
    printf("t address: %x \n", (unsigned int)t); 

    while (1) { 
     PROCESS_YIELD(); 
    } 

    PROCESS_END(); 
} 
+0

Спасибо, но он по-прежнему не работает. Та же проблема, что и раньше. – raspi

+0

@raspi Просто поместите все за пределы 'PROCESS_BEGIN();' кроме printf's –

+0

Вы хотите поставить его выше 'PROCESS_BEGIN();' Все еще нет разницы. – raspi