❶ keil AC6移植freeRTOS解決(100+)報錯問題
在使用keil移植freeRTOS時,需注意ac5與ac6編譯器差異導致移植port文件.c和.h時可能出現報錯問題。移植過程遵循以下步驟:
首先,下載freeRTOS源碼,網路上教程豐富。
其次,在hal庫或校準庫下建立文件,接著移植源碼,注意刪除無用內容。
然後,將移植的.c和.h文件在keil中關聯起來,編譯過程中會顯示未使用功能的報錯信息,需針對具體錯誤注釋或刪除相關代碼。
特別注意,在port.c文件中包含頭文件(如f407示例),之後編譯時若發現函數重定義錯誤,應根據報錯內容注釋到相應的函數。
對於stm32f4xx_it.c文件,確保注釋或刪除PendSV_Handler、SysTick_Handler和SVC_Handler,避免此類函數的未定義導致的報錯。
解決報錯的關鍵在於定義freeRTOS中未使用的鉤子函數(vApplicationStackOverflowHook、vApplicationIdleHook、vApplicationTickHook 和 vApplicationMallocFailedHook),即使不實際使用,也需提供空定義以確保編譯通過。
具體實現方式是將空定義添加到項目源文件中,例如main.c文件。正確操作後,所有報錯解決,移植freeRTOS至keil AC6過程完成。
❷ C++中static、inline、weak symbol和Unused warnning
C++中static、inline、weak symbol和Unused warning詳解1. staticstatic關鍵字在C++中有多種用途,其中兩種最常見的用法是:
本地作用域:當static修飾函數或變數時,它們的作用域被限制在定義它們的文件內,即它們不能與其他文件進行鏈接。這意味著,無論在頭文件還是cpp文件中使用static修飾的函數或變數,都必須在相應的文件中被使用,否則編譯器會報Unused warning。
匿名的namespace實際上和static擁有相同的本地作用域效果。在本地作用域內未被使用的函數或變數同樣會報Unused warning。
從static和匿名的namespace可以看出,所有局部(本地)作用域內的函數或變數都必須被使用,否則就會報Unused warning。
3. inlineinline關鍵字的行為在不同編譯器中可能有所不同,以下以GCC為例進行說明:
這解釋了為什麼將inline函數定義在頭文件中不會報重定義錯誤:鏈接的規則是,如果有多個強符號會出現重定義錯誤;但如果有多個weak符號,則會選擇空間最大的一個。因此,在多個cpp文件包含同一個inline函數定義後,最多也只是形成多個weak符號,不會導致重定義錯誤。
4. static inlinestatic inline修飾的函數既具有inline的效果,也具有static的效果:
因此,在頭文件中定義並實現多個函數時,使用static inline修飾可以避免Unused warning和重定義錯誤。
5. weak symbolweak symbol(弱符號)在鏈接時具有特殊的作用,常見的產生弱符號的方式包括:
弱符號的作用:在鏈接時,如果有多個弱符號和一個強符號,強符號會覆蓋弱符號。這種機制常用於實現函數覆蓋或提供默認實現,允許用戶在需要時提供自己的實現而無需修改原始代碼。
總結了解這些概念和行為對於編寫高質量、無警告的C++代碼至關重要。
❸ 關於C語言在編譯時常出現的錯誤有哪些
1、fatal error C1010: unexpected end of file while looking for precompiled header directive。
尋找預編譯頭文件路徑時遇到了不該遇到的文件尾。(一般是沒有#include "stdafx.h")
2、fatal error C1083: Cannot open include file: 'R…….h': No such file or directory
不能打開包含文件「R…….h」:沒有這樣的文件或目錄。
3、error C2011: 'C……': 'class' type redefinition
類「C……」重定義。
4、error C2018: unknown character '0xa3'
不認識的字元'0xa3'。(一般是漢字或中文標點符號)
5、error C2057: expected constant expression
希望是常量表達式。(一般出現在switch語句的case分支中)
6、error C2065: 'IDD_MYDIALOG' : undeclared identifier
「IDD_MYDIALOG」:未聲明過的標識符。
7、error C2082: redefinition of formal parameter 'bReset'
函數參數「bReset」在函數體中重定義。
8、error C2143: syntax error: missing ':' before '{'
句法錯誤:「{」前缺少「;」。
9、error C2146: syntax error : missing ';' before identifier 'dc'
句法錯誤:在「dc」前丟了「;」。
10、error C2196: case value '69' already used
值69已經用過。(一般出現在switch語句的case分支中)
11、error C2509: 'OnTimer' : member function not declared in 'CHelloView'
成員函數「OnTimer」沒有在「CHelloView」中聲明。
12、error C2511: 'reset': overloaded member function 'void (int)' not found in 'B'
重載的函數「void reset(int)」在類「B」中找不到。
13、error C2555: 'B::f1': overriding virtual function differs from 'A::f1' only by return type or calling convention
類B對類A中同名函數f1的重載僅根據返回值或調用約定上的區別。
14、error C2660: 'SetTimer' : function does not take 2 parameters
「SetTimer」函數不傳遞2個參數。
15、warning C4035: 'f……': no return value
「f……」的return語句沒有返回值。
16、warning C4553: '= =' : operator has no effect; did you intend '='?
沒有效果的運算符「= =」;是否改為「=」?
17、warning C4700: local variable 'bReset' used without having been initialized
局部變數「bReset」沒有初始化就使用。
18、error C4716: 'CMyApp::InitInstance' : must return a value
「CMyApp::InitInstance」函數必須返回一個值。
19、LINK : fatal error LNK1168: cannot open Debug/P1.exe for writing
連接錯誤:不能打開P1.exe文件,以改寫內容。(一般是P1.Exe還在運行,未關閉)
20、error LNK2001: unresolved external symbol "public: virtual _ _thiscall C……::~C……(void)"
連接時發現沒有實現的外部符號(變數、函數等)。
function call missing argument list 調用函數的時候沒有給參數。
member function definition looks like a ctor, but name does not match enclosing class 成員函數聲明了但沒有使用
unexpected end of file while looking for precompiled header directive 在尋找預編譯頭文件時文件意外結束,編譯不正常終止可能造成這種情況
❹ c語言 頭文件中放函數實體 兩個c文件同時引用會報錯:找到一個或多個重定義的符號
C語言頭文件中一般只進行函數聲明,函數實現一般另寫在文件中,這樣引用頭文件就不會報重復定義了。
你的兩個c文件在一個工程中,同時引用你定義的那種,在編譯時,兩個c文件都會將這段代碼(頭文件中的)展開到你的c文件中,因此,會報重復定義