成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

C語言操作寄存器和函數(shù)指針

開發(fā)
寄存器的功能是存儲(chǔ)二進(jìn)制代碼?,它是由具有存儲(chǔ)功能的觸發(fā)器?組合起來構(gòu)成的。

typedef函數(shù)指針類型

#include <stdio.h>
//函數(shù)指針類型別名
/*
	* int 函數(shù)返回值
	* (int,int)函數(shù)參數(shù),兩個(gè)參數(shù)int,int
	* *PTP_TO_FUNC函數(shù)指針,指向函數(shù)的指針
*/
typedef int (*PTR_TO_FUNC)(int, int);
/*
	為數(shù)組定義別名與函數(shù)指針類型別名類似
	[4]數(shù)組各屬
	PTR_TO_ARR指向數(shù)組的名,其數(shù)組個(gè)數(shù)與參數(shù)個(gè)數(shù)相同
	在使用是當(dāng)成一種類型,在為其賦值時(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ā)器組合起來構(gòu)成的。一個(gè)觸發(fā)器可以存儲(chǔ)1位二進(jìn)制代碼,故存放n位二進(jìn)制代碼的寄存器,需要n個(gè)觸發(fā)器來構(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位沒有使用,就不會(huì)有影響,但是如果高7位正在被使用,那么就會(huì)發(fā)生錯(cuò)誤。

  • 與運(yùn)算 :對(duì)于二進(jìn)制位操作,不管原值是0還是1,它跟0進(jìn)行&與運(yùn)算,得到的結(jié)果都是 0,而和1進(jìn)行&運(yùn)算,將保持原來的值不變
  • 或運(yùn)算 :不管該位原來的值是0還是1,它跟1進(jìn)行 |運(yùn)算,得到的結(jié)果都是1,而跟0運(yùn)算,將保持原來的值不變。`

可以使用或運(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位,

通過左移而不是直接設(shè)置一個(gè)固定的值 :為了提高代碼的可讀性,直接就知道修改了第幾位:

GPIOA->ODR |= 1<<5; //PA.5輸出高,其它位不變

設(shè)置某位為0

簡(jiǎn)單操作:

TIMx->SR = 0xFFF7; //此方法仍然影響可讀性,

庫(kù)函數(shù):

TIMx -> SR = (uint16_t)~TIM_FLAG;

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)

位域

位域:或稱之為位段,英文表達(dá)式 Bit field 是一種數(shù)據(jù)結(jié)構(gòu),可以把數(shù)據(jù)以位元的形式緊湊的存儲(chǔ),并允許程序員對(duì)此結(jié)構(gòu)進(jìn)行位元進(jìn)行操作。

優(yōu)勢(shì):

  • 可以使數(shù)據(jù)單元節(jié)省存儲(chǔ)空間
  • 位段可以很方便地訪問一個(gè)整數(shù)值的部分內(nèi)容從而簡(jiǎn)化程序源代碼。

位域可以分為兩大類,一個(gè)是結(jié)構(gòu)體位域,一個(gè)是共同體位域,由于共同體和結(jié)構(gòu)體兩者在定義上的形式都是相同的,從位域的定義形式上看,兩者也基本都是相同的。

struct 位域結(jié)構(gòu)體
{
    類型說明符 位域名 : 長(zhǎng)度;
}結(jié)構(gòu)體變量名;
// 結(jié)構(gòu)體位域
struct example0
{
    unsignedchar x : 3; //冒號(hào)后面的證書指定了該位段所占用的位的數(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)體位域的總大小為最寬基本類型成員大小的整數(shù)倍。

位域基本都使用無符號(hào)類型。

位域注意

  • 結(jié)構(gòu)體位域成員不能使用取址操作
  • 結(jié)構(gòu)體成員不能夠使用static修飾
  • 結(jié)構(gòu)體位域成員不能使用數(shù)組。

不同的處理器,不同的編譯器對(duì)位域的影響,位域雖然能夠以位的形式操作數(shù)據(jù),但是也被人們告知要慎重使用,原因在于不同的處理器結(jié)構(gòu),不同的編譯器對(duì)于位域的一些特征會(huì)產(chǎn)生不同的結(jié)果。

處理器大端模式,小端模式的處理器也會(huì)對(duì)下面的結(jié)構(gòu)體位域產(chǎn)生不一樣的存儲(chǔ)方式。

不同的編譯器,結(jié)構(gòu)體位域成員不同類型,不同的編譯器對(duì)于位域會(huì)有不同的結(jié)果

當(dāng)成員大小之和超過一個(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;
責(zé)任編輯:趙寧寧 來源: 瓶子的跋涉
相關(guān)推薦

2025-06-10 02:22:00

C語言硬件寄存器

2011-07-15 01:20:58

C指針函數(shù)函數(shù)指針

2021-01-13 06:58:35

C語言函數(shù)指針

2009-12-17 17:31:38

2017-07-05 14:37:07

Linux調(diào)試器寄存器和內(nèi)存

2021-03-25 13:05:56

網(wǎng)絡(luò)安全寄存器匯編語言

2018-10-22 12:18:50

存儲(chǔ)器內(nèi)存寄存器

2020-10-15 14:50:24

寄存器CPU部件

2021-03-15 10:00:38

鴻蒙HarmonyOS應(yīng)用

2016-12-05 13:35:02

C語言數(shù)組指針

2021-08-13 07:56:13

CPU寄存器數(shù)據(jù)

2021-02-26 08:46:46

PHY寄存器網(wǎng)絡(luò)

2010-01-18 15:53:27

C++析構(gòu)函數(shù)

2009-04-20 14:55:20

思科配置寄存器

2020-10-10 10:14:42

Linux內(nèi)核

2023-11-22 13:22:51

C++函數(shù)

2015-03-09 09:34:04

C語言函數(shù)指針

2021-04-13 07:58:42

Go語言函數(shù)

2020-09-23 16:55:43

C語言編程語言

2009-01-08 09:26:06

C語言指針類型
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 日韩欧美理论片 | 成人三级av | 男女视频91 | 久久久久久999 | 日韩精品免费看 | 亚洲精品久久久久久一区二区 | 欧美在线视频二区 | 国产中文字幕网 | 午夜视频一区 | 91素人| 国产精品国产亚洲精品看不卡15 | www.日韩在线| 91精品久久久久久久久久入口 | 又爽又黄axxx片免费观看 | 日日久 | 国产精品久久久久久久久 | 国产一区二区自拍 | 欧美黑人体内she精在线观看 | 91精品国产综合久久久亚洲 | 天堂成人国产精品一区 | 日韩精品成人在线 | 亚洲国产精品99久久久久久久久 | 国产农村妇女精品一二区 | 欧美簧片| 国产精品欧美一区喷水 | 国产精品美女www爽爽爽视频 | 久久精品91久久久久久再现 | 久久噜噜噜精品国产亚洲综合 | 福利视频网| 免费中文字幕日韩欧美 | 国产一级免费在线观看 | h在线 | 亚洲免费片 | 亚洲毛片在线观看 | 精品欧美一区二区三区久久久 | 亚洲一区二区免费视频 | 亚洲精品一区二区三区中文字幕 | 亚洲综合色自拍一区 | 日韩高清三区 | 欧美精品久久久久久久久老牛影院 | 最新中文字幕在线 |