MCU學習筆記
C語言基礎
1. 位操作
2. define宏定義關鍵詞
3. ifdef /ifndef 條件編譯
4. extern變數宣告
5. typedef 型別別名
6. 結構體
7. static關鍵詞
8. __weak弱函式
1. 位操作
-
6種位操作運算子
“&”:按位與;
“|”:按位或;兩個操作位,只要有一個為1,結果就為1;
“^”:按位異或;兩個操作位不同時,結果為1;
“~”:取反;
“<<”:左移;
“>>”:右移;
2. define宏定義關鍵詞
-
define,預處理命令,用于宏定義,可以提高代碼的可讀性,為編程提供方便,
-
格式:#define 識別符號 字串
識別符號:所定義的宏名,
字串:可以是常數,運算式,格式串 -
例子:
//定義識別符號SYSCLK_72MHz的值為72000000
#define SYSCLK_72MHz 72000000
3. ifdef /ifndef 條件編譯
- 單片機程式開發中,經常遇到一種情況,當滿足某條件時,對一組程式進行編譯,而當不滿足條件時,則編譯另一組程式,
- 格式:
#ifdef 識別符號 //如果定義了識別符號
編譯程式段1 //執行程式段1
#else //如果沒有定義識別符號
編譯程式段2 //執行程式段2
#endif
- 例子:
#define TAG 1 //定義TAG 為1
#ifdef TAG //條件編譯TAG
void test ifdef (void) //如果條件編譯TAG存在
{
printf(”this tag is defined”);//列印this tag is defined
}
#else //如果條件編譯TAG不存在
void test ifdef (void) //列印this tag is not defined
{
printf(”this tag is not defined”);
}
#endif
- 格式:
#ifndef 識別符號//如果沒有定義
編譯程式段1 //執行編譯程式段1
#else //如果定義
編譯程式段2 //執行條件編譯程式2
#endif
- 例子:
#define TAG 1 //定義TAG 為1
#ifndef TAG //如果沒有條件編譯TAG
void test ifdef (void) //執行此段程式
{
printf(”this tag is defined”);
}
#else //如果條件編譯TAG
void test ifdef (void) //執行此段程式
{
printf(”this tag is not defined”);
}
#endif
4. extern變數宣告
- C語言中 extern可以放在變數或者函式前,以表示變數(全域變數)或者函式的定義在別的檔案中,提示編譯器遇到此變數和函式時,在其他模塊中尋找其定義,
- 注意: 對于extern,宣告變數可以多次,但對變數的定義只能有一次,
- 格式
extern 變數型別 變數名稱
- 例子
//整型變數id是定義在其他檔案中的變數,如果想在當前檔案中使用,可以使用extern變數宣告
extern int id
5. typedef 型別別名
- 為一個型別重新定義一種別名,而不只是簡單的宏替換,可以用作同時宣告指標型的多個物件,
- 格式
typedef 原型別名 別名
- 例子
//將無符號字符定義為 uint8_t
typedef unsigned char uint8_t;
//將無符號短整型定義為 uint16_t
typedef unsigned short int uint16_t;
//將無符號整型定義為 uint32_t
typedef unsigned int uint32_t;
6. 結構體
- 結構體,構造型別
- 在結構體宣告的時候,可以定義變數,也可以宣告之后定義;方法:struct 結構體名字 結構體變數串列;
- 格式
struct 結構體名{
成員串列1;
成員串列2;
...
}變數名串列;
-
結構體作用
同一個型別可以用陣列,不同型別可以用結構體組織,
結構體的擴展性很強,可用于外設的初始化,
7. static關鍵詞
- static,可以放在變數和函式之前,static宣告的區域變數,存盤在靜態存盤區;在函式呼叫之后,不會被釋放,它的值會一直保留下來,所以說,static宣告的區域變數,具有記憶功能,
- 注意:
static宣告的函式作用域僅限當前的.c檔案,其他.c無法呼叫,
static宣告的區域變數,即靜態的區域變數,在初始化的時候,只會被初始化一次, - 格式
static 變數型別 變數名稱
- 例子
//static 宣告變數
void getstaticval(void) //
{
static int val=0;
val++;
return val;
}
//普通宣告變數
void getval(void) //
{
int val=0;
val++;
return val;
}
//測驗函式
void teststaticval(void) //
{
int cnt=5;
cnt--;
while(cnt--)
{
printf("get val= d%/r/n," getval()); //呼叫getval函式
}
cnt=5;
while(cnt--)
{
printf("get static val= d%/r/n," getstaticval()); //呼叫getstaticval函式
}
}
8. __weak弱函式
- 弱函式定義的內容,沒有實際操作,需要用戶自己寫;當用戶沒有重新寫時,操作的程序中,直接呼叫弱函式;當用戶重新寫后,操作的程序中,呼叫用戶重新寫的程式內容,
- weak函式和重寫的函式不能放在同一個檔案
- 避免重復定義
- 如果用戶沒有重寫,那么會執行弱函式,如果用戶重寫該函式,那么會執行弱函式
- 格式
__weak void 函式名()
{
函式操作內容
}
- 例子:
//當用戶沒有重新寫時,操作的程序中,直接檔案1中的testweak();當用戶重新寫后,操作的程序中,呼叫用戶重新寫的檔案2中的testweak(),
//檔案1中
__weak void testweak()
{
printf("testweak function");
}
//檔案2中
//用戶撰寫的函式
```c
void testweak()
{
printf("test function");
}
int main(void)
{
testweak();
}
參考資料:正點原子STM32視頻 Thanks^^
【注】:個人學習筆記,如有錯誤,望不吝賜教,這廂有禮了~~~
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/278159.html
標籤:其他
上一篇:STM32單片機(五).中斷系統
下一篇:牛客小白月賽33
