c中stm32l中的数据损坏

时间:2013-07-30 04:16:07

标签: c data-structures embedded

当从main传递给httpinit()时,我在变量u32baudrate中发现了一些数据损坏。但其他变量txsize和flowcontrol正确出现。

typedef struct _test
{
  ...
  uint8_t txsize[5];
  uint32_t u32baudrate;
  uint8_t flowcontrol;
  ...
}test;
来自main.c的

test gtest;
gtest.u32baudrate=921600;
printf("baud: %d",gtest.u32baudrate);        //921600: this is coming out right

httpinit(&gtest);

在http.c

httpinit(test * gtest)
{
  printf("baud: %d",gtest->u32baudrate);     //268435456: this is coming out wrong
}

5 个答案:

答案 0 :(得分:2)

发现问题,它正在打包,通过这样做来修复它 - >

typedef PACKED struct _test
{
  ...
  uint8_t txsize[5];
  uint32_t u32baudrate;
  uint8_t flowcontrol;
  ...
}test;

答案 1 :(得分:1)

我认为这可能有所帮助,但不确定:)

typedef struct    //delete this so test is the struct type name// _test
{
  ...
  uint8_t txsize[5];
  uint32_t u32baudrate;
  uint8_t flowcontrol;
  ...
}test;

答案 2 :(得分:1)

问题很可能出在您尚未发布的代码中。

一些printf()实现使用相对大量的堆栈;您的调试方法可能导致堆栈溢出。尝试删除第一个printf来电,以便在分配和httptest()通话之间没有任何内容。如果它没有被破坏,printf()本身就会导致问题,你可能需要分配一个更大的堆栈。

否则可能会对txsize[]进行越界访问。这真的是您正在测试的代码 - 在分配后直接调用httptest() - 或者您是否已经省略了所提供的代码?

答案 3 :(得分:0)

printf()格式说明符%d用于打印有符号整数。但是,uint32_t是无符号整数类型。无符号整数的通常格式说明符是%u

答案 4 :(得分:0)

Packed与此错误无关。通常,printf上的错误会导致堆栈损坏。考虑一下:

struct wp_char{
      char wp_cval;
      short wp_font;
      short wp_psize;
}v1;

struct wp_char v2;

v1和v2有什么区别?它们不同或相同吗?哎呀......误按了回车键。

顺便说一下,以下代码对我来说非常适合。

#include <stdio.h>
#include <limits.h>

typedef unsigned char uint8_t;
typedef unsigned int uint32_t;

typedef struct _test
{
    uint8_t txsize[5];
    uint32_t u32baudrate;
    uint8_t flowcontrol;
}test;

print_value(test *gtest)
{
        printf("%u\n", gtest->u32baudrate);
}

main()
{
        test gtest;

        gtest.u32baudrate = 921600;
        printf("%u\n", gtest.u32baudrate);

        print_value(&gtest);
}