Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Variables Stm32 freertos,我的项目中的所有变量都不能更改_Variables_Extern_Stm32 - Fatal编程技术网

Variables Stm32 freertos,我的项目中的所有变量都不能更改

Variables Stm32 freertos,我的项目中的所有变量都不能更改,variables,extern,stm32,Variables,Extern,Stm32,我不明白为什么freertos不允许更改外部变量 (myData) 这是我的作品 文件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); vTaskSt

我不明白为什么freertos不允许更改外部变量 (myData) 这是我的作品


文件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”之类

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

  • 不能使用
    %d
    打印
    uint16\t
    的值<代码>%d需要一个
    int
    。您必须在
    printf()
    调用中将值强制转换为
    int
    printf(“结果:%d”,(int)Mydata);
    ),或者使用适当的说明符(
    printf(“结果:%“PRIu16”,Mydata);
    )。您的工具链可能不支持第二种解决方案
  • 您的变量应该声明为volatile,否则编译器可能会读取它一次,而不会更新RAM中的值

  • 非常感谢你!我已经像你告诉我的那样改变了我的项目,但是错误并没有消失。我是否需要任何功能将数据从一个任务传输到另一个任务?@loi.efy-问题一定在别处。我怀疑由于线程中的堆栈溢出,您可能会覆盖全局变量。根据具体的编译标志和工具链配置,
    printf()
    最多可以使用2kB的堆栈(是的-这是正确的-两个KB)。您只为线程提供100B,这对于任何有用的东西来说都太少了。然后,我将开始大幅增加堆栈大小(对于使用
    printf()
    的线程,为3-4kB)并启用堆栈溢出检查。