2017-02-16 108 views
1

我不明白爲什麼FreeRTOS操作系統不允許改變的extern變量 (MYDATA的) 這裏是我的pojectSTM32 FreeRTOS操作系統,所有的變量不能在我的項目變化


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
  1. 不能打印的uint16_t值使用%d%d需要int。您必須在printf()致電(printf("Result: %d", (int)Mydata);)中將您的值轉換爲int,或使用適當的說明符(printf("Result: %" PRIu16 "", Mydata);)。您的工具鏈可能不支持第二種解決方案。

http://en.cppreference.com/w/cpp/io/c/fprintf

  • 你的變量應聲明volatile,否則編譯器可以及讀它一旦從不更新從RAM中的值。
  • +0

    非常感謝! –

    +0

    我改變了我的項目,就像你告訴我要做的一樣,但錯誤並沒有消失。我是否需要任何功能將數據從一個任務轉移到另一個任務? –

    +0

    @ loi.efy - 問題必須在別處。我懷疑由於線程中的堆棧溢出,您可能會覆蓋全局變量。根據確切的編譯標誌和工具鏈配置,'printf()'可以使用高達2kB的堆棧(是的 - 這是正確的 - 兩千字節)。你只提供100B到你的線程,對於任何有用的東西來說太少了。然後,我會開始大幅增加堆棧大小(帶有'printf()'的線程爲3-4kB)並啓用堆棧溢出檢查。 –

    相關問題