Stm32 freertos,我的项目

时间:2017-02-16 11:25:57

标签: variables extern stm32

我不明白为什么freertos不允许更改外部变量 (MYDATA的) 这是我的项目

file main.c

uint16_t Mydata = 0;

main()
{
    System_Init();
    xTaskCreate(Task1, (const char*)"Task1", 100, NULL, 4, NULL);   
    xTaskCreate(Task2, (const char*)"Task2", 100, NULL, 3, NULL);   
    vTaskStartScheduler();
}

文件Task1.c

extern uint16_t Mydata;

void Task1(void *p)
{ 
    while(1)
    {
        vTaskDelay(10);
        printf("Result: %d", Mydata);
    }
}

文件Task2.c

extern uint16_t Mydata;

void Task2(void *p)
{
    while(1)
    {
       Mydata++;
       vTaskDelay(10);
    }
}

但结果永远不会正确

大部分结果都像" 13842930"," -18234952",或类似的东西!

谁能告诉我为什么? (因为我英语不好,我很抱歉) 谢谢你的帮助!

1 个答案:

答案 0 :(得分:1)

  1. 您无法使用%d打印uint16_t的值。 %d需要int。您必须在int调用(printf())中将值转换为printf("Result: %d", (int)Mydata);,或使用适当的说明符(printf("Result: %" PRIu16 "", Mydata);)。您的工具链可能不支持第二种解决方案。
  2. http://en.cppreference.com/w/cpp/io/c/fprintf

    1. 您的变量应该声明为volatile,否则编译器也可以在从不更新RAM中的值时读取它。