Variables Stm32 freertos,我的项目中的所有变量都不能更改
我不明白为什么freertos不允许更改外部变量 (myData) 这是我的作品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
文件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);
)。您的工具链可能不支持第二种解决方案非常感谢你!我已经像你告诉我的那样改变了我的项目,但是错误并没有消失。我是否需要任何功能将数据从一个任务传输到另一个任务?@loi.efy-问题一定在别处。我怀疑由于线程中的堆栈溢出,您可能会覆盖全局变量。根据具体的编译标志和工具链配置,
printf()
最多可以使用2kB的堆栈(是的-这是正确的-两个KB)。您只为线程提供100B,这对于任何有用的东西来说都太少了。然后,我将开始大幅增加堆栈大小(对于使用printf()
的线程,为3-4kB)并启用堆栈溢出检查。