STM32F105,arm-none-eabi-gcc,Contiki:在结构中存储浮点数并在 C 中打印浮点数失败



我有两个typedef struct如下所示:

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

我接下来尝试的是为my_type结构分配内存,从创建的my_type对象指向的tlv_t结构,以及从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: %in", (int) *(float*) tv->value); 
printf("tv->value: %in", (int) *(float*) tv->value); // without this line it is working

编辑:

我忘了添加这些类型定义:

typedef unsigned char UInt8;
typedef unsigned short UInt16;
typedef unsigned long UInt32;

编辑2:这是完整的代码:

#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: %in", (int) *(float*) tv->value); 
printf("tv->value: %in", (int) *(float*) tv->value); // without this line it is working
while (1) {
PROCESS_YIELD();
}
PROCESS_END();
}

编辑3:

我使用的是最新的 arm-none-eabi-gcc(版本 4_8-2013q4-20131204)。处理结构、浮点数或内存管理时是否存在任何已知问题?

试试

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: %in", (int) *(float*) tv->value); 
printf("tv->value: %in", (int) *(float*) tv->value); // without this line it is working
printf("t address: %x n", (unsigned int)t);
while (1) {
PROCESS_YIELD();
}
PROCESS_END();
}

我建议你修复你的代码,这样你就不再收到编译器警告了(不要关闭它们)。根据需要添加演员表。 在我做了这些修复之后,你的代码对我有用,所以代码很丑,但还可以。

#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: %in", (int) *(float*) tv->value); 
printf("tv->value: %in", (int) *(float*) tv->value); // without this line it
getchar();
}

给 电视>值:212 电视>值:212

相关内容

  • 没有找到相关文章

最新更新