#include <stdio.h>//函數(shù)指針類(lèi)型別名/* * int 函數(shù)返回值 * (int,int)函數(shù)參數(shù),兩個(gè)參數(shù)int,int * *PTP_TO_FUNC函數(shù)指針,指向函數(shù)的指針*/typedef int (*PTR_TO_FUNC)(int, int);/* 為數(shù)組定義別名與函數(shù)指針類(lèi)型別名類(lèi)似 [4]數(shù)組各屬 PTR_TO_ARR指向數(shù)組的名,其數(shù)組個(gè)數(shù)與參數(shù)個(gè)數(shù)相同 在使用是當(dāng)成一種類(lèi)型,在為其賦值時(shí)需要重新為其添加值*/typedef char(*PTR_TO_ARR)[10]; //實(shí)現(xiàn)函數(shù)體int max(int x, int y){ return x > y ? x : y;}int main(void){ //定義數(shù)組,等待指向 char str[3][10] = { "嘿嘿", "信息科技", "有限公司" }; // PTR_TO_ARR結(jié)構(gòu)體指針,仍需要定義別名 PTR_TO_ARR arr = str[1]; // 指向函數(shù) PTR_TO_FUNC func = max; printf("max(6,3): %d/n", (*func)(6, 3)); printf("str[1]: %s/n", (*arr)); //輸出信息科技 return0;}有限存貯容量的高速存貯部件 。寄存器的功能是存儲(chǔ)二進(jìn)制代碼,它是由具有存儲(chǔ)功能的觸發(fā)器組合起來(lái)構(gòu)成的。一個(gè)觸發(fā)器可以存儲(chǔ)1位二進(jìn)制代碼,故存放n位二進(jìn)制代碼的寄存器,需要n個(gè)觸發(fā)器來(lái)構(gòu)成。
基本寄存器 :只能并行送入數(shù)據(jù),也只能并行輸出。
移位寄存器中的數(shù)據(jù)可以在移位脈沖作用下依次逐位右移或左移,數(shù)據(jù)既可以并行輸入,并行輸出,也可以串行輸入,串行輸出,還可以并行輸入,串行輸出或串行輸入,并行輸出,靈活,用途廣泛。
在嵌入式編程中,常常需要對(duì)一些寄存器進(jìn)行配置,有的情況下需要改變一1個(gè)字節(jié)中的某一位或者幾位,但是又不想改變其它位原有的值,就可以使用按位運(yùn)算符進(jìn)行操作。
假如我們只需要設(shè)置第0位bit0的值為1時(shí), 要保持其它位 不發(fā)生變化。
TEST = 0x01此方式如果高7位沒(méi)有使用,就不會(huì)有影響,但是如果高7位正在被使用,那么就會(huì)發(fā)生錯(cuò)誤。
可以使用或運(yùn)算:
TEST = TEST | 0x01;// 在實(shí)際中常用TEST |= 0x01;給Test的低4位清 0 ,高四位保持不變:
TEST &= 0xF0; //使用十六進(jìn)制此方法在單片機(jī)中經(jīng)常使用,先對(duì)需要設(shè)置的位用 &操作符進(jìn)行清零操作,然后用 | 操作符設(shè)置值,改變GPIOA的狀態(tài),先對(duì)寄存器的值進(jìn)行清零操作,然后根據(jù)需要設(shè)置的值進(jìn)行 | 或運(yùn)算:
GPIOA->CRL &= 0XFFFFFF0F; // 將第4~7位清零GPIOA->CRL &= 0X00000040; //設(shè)置相應(yīng)的值,不改變其他位的值GPIOx->BSRR = (((uint32_t)0x01) << pinpox); //將0x01 左移pinpox位,通過(guò)左移而不是直接設(shè)置一個(gè)固定的值 :為了提高代碼的可讀性,直接就知道修改了第幾位:
GPIOA->ODR |= 1<<5; //PA.5輸出高,其它位不變簡(jiǎn)單操作:
TIMx->SR = 0xFFF7; //此方法仍然影響可讀性,庫(kù)函數(shù):
TIMx -> SR = (uint16_t)~TIM_FLAG;設(shè)置SR的第三位為 0 時(shí)即可設(shè)置為
TIMx->SR = (uint16_t)~TIM_FLAG_CC3;#define TIM_FLAG_Update ((uint16_t)0x0001)#define TIM_FLAG_CC1 ((uint16_t)0x0002)#define TIM_FLAG_CC2 ((uint16_t)0x0004)#define TIM_FLAG_CC3 ((uint16_t)0x0008)#define TIM_FLAG_CC4 ((int16_t)0x0010)#define TIM_FLAG_COM ((uint16_t)0x0020)#define TIM_FLAG_Trigger ((uint16_t)0x0040)#define TIM_FLAG_Break ((uint16_t)0x0080)#define TIM_FLAG_CC1OF ((uint16_t)0x0200)#define TIM_FLAG_CC2OF ((uint16_t)0x0400)#define TIM_FLAG_CC3OF ((uint16_t)0x0800)#define TIM_FLAG_CC4OF ((uint16_t)0x1000)位域:或稱(chēng)之為位段,英文表達(dá)式 Bit field 是一種數(shù)據(jù)結(jié)構(gòu),可以把數(shù)據(jù)以位元的形式緊湊的存儲(chǔ),并允許程序員對(duì)此結(jié)構(gòu)進(jìn)行位元進(jìn)行操作。
優(yōu)勢(shì):
位域可以分為兩大類(lèi),一個(gè)是結(jié)構(gòu)體位域,一個(gè)是共同體位域,由于共同體和結(jié)構(gòu)體兩者在定義上的形式都是相同的,從位域的定義形式上看,兩者也基本都是相同的。
struct 位域結(jié)構(gòu)體{ 類(lèi)型說(shuō)明符 位域名 : 長(zhǎng)度;}結(jié)構(gòu)體變量名;// 結(jié)構(gòu)體位域struct example0{ unsignedchar x : 3; //冒號(hào)后面的證書(shū)指定了該位段所占用的位的數(shù)目。 unsignedchar y : 2; unsignedchar z : 1;}ex0_t;// 共同體位域union example1{ unsignedchar x : 3; unsignedchar y : 2; unsignedchar z : 1;}ex1_u;位域大小原則 :整個(gè)結(jié)構(gòu)體位域的總大小為最寬基本類(lèi)型成員大小的整數(shù)倍。
位域基本都使用無(wú)符號(hào)類(lèi)型。
不同的處理器,不同的編譯器對(duì)位域的影響,位域雖然能夠以位的形式操作數(shù)據(jù),但是也被人們告知要慎重使用,原因在于不同的處理器結(jié)構(gòu),不同的編譯器對(duì)于位域的一些特征會(huì)產(chǎn)生不同的結(jié)果。
處理器大端模式,小端模式的處理器也會(huì)對(duì)下面的結(jié)構(gòu)體位域產(chǎn)生不一樣的存儲(chǔ)方式。
不同的編譯器,結(jié)構(gòu)體位域成員不同類(lèi)型,不同的編譯器對(duì)于位域會(huì)有不同的結(jié)果
當(dāng)成員大小之和超過(guò)一個(gè)基本存儲(chǔ)空間時(shí),不同的編譯器也會(huì)有不同的處理方式。
typedefunion{ unsignedchar Byte; struct { unsignedchar bit012 : 3; unsignedchar bit34 : 2; unsignedchar bit5 : 1; unsignedchar bit6 : 1; unsignedchar bit7 : 1; }bits;}registerType;存儲(chǔ)0x0000 8000定義一個(gè)指針指向地址:
registerType *pReg = (register*)0x00008000;// 使用位域寄存器進(jìn)行賦值pReg->bits.bit5 = 1;pReg->bits.bit012 = 7;
本文鏈接:http://m.www897cc.com/showinfo-26-10474-0.htmlC語(yǔ)言操作寄存器和函數(shù)指針
聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com
上一篇: 利用開(kāi)放接口,如何一步步打造自己的獨(dú)特圖片網(wǎng)站
下一篇: 優(yōu)化自動(dòng)化接口測(cè)試:利用鉤子函數(shù)增強(qiáng)HTTP請(qǐng)求處理