STM32F105,arm-none-eabi-gcc,Contiki:在struct中存储float并在C中打印float失败

时间:2014-01-24 17:02:34

标签: struct malloc cortex-m3 stm32 contiki

我有两个typedef struct,如下所示:

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

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

我接下来尝试的是为my_type结构分配内存,从创建的tlv_t对象指向的my_type结构以及指向的浮点数。来自tlv_t对象。

如果我执行的代码没有下面代码的最后一行,那么它运行良好。我可以存储该值,我可以访问它。
但是当我第二次尝试访问它时,上传的代码在基于Contiki的STM32F105板上完全没有运行。奇怪的是,这只是使用浮点数时的情况。与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

修改

我忘了添加这些typedef:

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)。在处理结构,浮点数或内存管理时是否存在任何已知问题?

2 个答案:

答案 0 :(得分: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();
}

答案 1 :(得分: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-&gt;值:212     tv-&gt;值:212