当前位置:首页 > 科技  > 软件

C语言操作寄存器和函数指针

来源: 责编: 时间:2023-09-18 21:41:56 437观看
导读typedef函数指针类型#include <stdio.h>//函数指针类型别名/* * int 函数返回值 * (int,int)函数参数,两个参数int,int * *PTP_TO_FUNC函数指针,指向函数的指针*/typedef int (*PTR_TO_FUNC)(int, int);/* 为数组定义别

8hM28资讯网——每日最新资讯28at.com

typedef函数指针类型

#include <stdio.h>//函数指针类型别名/*	* int 函数返回值	* (int,int)函数参数,两个参数int,int	* *PTP_TO_FUNC函数指针,指向函数的指针*/typedef int (*PTR_TO_FUNC)(int, int);/*	为数组定义别名与函数指针类型别名类似	[4]数组各属	PTR_TO_ARR指向数组的名,其数组个数与参数个数相同	在使用是当成一种类型,在为其赋值时需要重新为其添加值*/typedef char(*PTR_TO_ARR)[10]; //实现函数体int max(int x, int y){	return x > y ? x : y;}int main(void){	//定义数组,等待指向	char str[3][10] = {		"嘿嘿",		"信息科技",		"有限公司"	};	// PTR_TO_ARR结构体指针,仍需要定义别名	PTR_TO_ARR arr = str[1];	// 指向函数	PTR_TO_FUNC func = max;	printf("max(6,3): %d/n", (*func)(6, 3));	printf("str[1]: %s/n", (*arr)); //输出信息科技	return0;}

寄存器

有限存贮容量的高速存贮部件 。寄存器的功能是存储二进制代码,它是由具有存储功能的触发器组合起来构成的。一个触发器可以存储1位二进制代码,故存放n位二进制代码的寄存器,需要n个触发器来构成。8hM28资讯网——每日最新资讯28at.com

8hM28资讯网——每日最新资讯28at.com

寄存器分类

基本寄存器 :只能并行送入数据,也只能并行输出。8hM28资讯网——每日最新资讯28at.com

移位寄存器中的数据可以在移位脉冲作用下依次逐位右移或左移,数据既可以并行输入,并行输出,也可以串行输入,串行输出,还可以并行输入,串行输出或串行输入,并行输出,灵活,用途广泛。8hM28资讯网——每日最新资讯28at.com

使用

在嵌入式编程中,常常需要对一些寄存器进行配置,有的情况下需要改变一1个字节中的某一位或者几位,但是又不想改变其它位原有的值,就可以使用按位运算符进行操作。8hM28资讯网——每日最新资讯28at.com

8hM28资讯网——每日最新资讯28at.com

假如我们只需要设置第0位bit0的值为1时, 要保持其它位  不发生变化。8hM28资讯网——每日最新资讯28at.com

TEST = 0x01

此方式如果高7位没有使用,就不会有影响,但是如果高7位正在被使用,那么就会发生错误。8hM28资讯网——每日最新资讯28at.com

  • 与运算 :对于二进制位操作,不管原值是0还是1,它跟0进行&与运算,得到的结果都是 0,而和1进行&运算,将保持原来的值不变
  • 或运算 :不管该位原来的值是0还是1,它跟1进行 |运算,得到的结果都是1,而跟0运算,将保持原来的值不变。`

可以使用或运算:8hM28资讯网——每日最新资讯28at.com

TEST = TEST | 0x01;// 在实际中常用TEST |= 0x01;

给Test的低4位清 0 ,高四位保持不变:8hM28资讯网——每日最新资讯28at.com

TEST &= 0xF0;   //使用十六进制

此方法在单片机中经常使用,先对需要设置的位用 &操作符进行清零操作,然后用 | 操作符设置值,改变GPIOA的状态,先对寄存器的值进行清零操作,然后根据需要设置的值进行 | 或运算:8hM28资讯网——每日最新资讯28at.com

GPIOA->CRL &= 0XFFFFFF0F; // 将第4~7位清零GPIOA->CRL &= 0X00000040; //设置相应的值,不改变其他位的值

移位提高可读性

GPIOx->BSRR = (((uint32_t)0x01) << pinpox); //将0x01 左移pinpox位,

通过左移而不是直接设置一个固定的值 :为了提高代码的可读性,直接就知道修改了第几位:8hM28资讯网——每日最新资讯28at.com

8hM28资讯网——每日最新资讯28at.com

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

设置某位为0

简单操作:8hM28资讯网——每日最新资讯28at.com

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

库函数:8hM28资讯网——每日最新资讯28at.com

TIMx -> SR = (uint16_t)~TIM_FLAG;

TIM_FLAG定义

设置SR的第三位为 0 时即可设置为8hM28资讯网——每日最新资讯28at.com

8hM28资讯网——每日最新资讯28at.com

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)

位域

位域:或称之为位段,英文表达式 Bit field 是一种数据结构,可以把数据以位元的形式紧凑的存储,并允许程序员对此结构进行位元进行操作。8hM28资讯网——每日最新资讯28at.com

优势:8hM28资讯网——每日最新资讯28at.com

  • 可以使数据单元节省存储空间
  • 位段可以很方便地访问一个整数值的部分内容从而简化程序源代码。

位域可以分为两大类,一个是结构体位域,一个是共同体位域,由于共同体和结构体两者在定义上的形式都是相同的,从位域的定义形式上看,两者也基本都是相同的。8hM28资讯网——每日最新资讯28at.com

struct 位域结构体{    类型说明符 位域名 : 长度;}结构体变量名;// 结构体位域struct example0{    unsignedchar x : 3; //冒号后面的证书指定了该位段所占用的位的数目。    unsignedchar y : 2;    unsignedchar z : 1;}ex0_t;// 共同体位域union example1{    unsignedchar x : 3;    unsignedchar y : 2;    unsignedchar z : 1;}ex1_u;

位域大小原则 :整个结构体位域的总大小为最宽基本类型成员大小的整数倍。8hM28资讯网——每日最新资讯28at.com

位域基本都使用无符号类型。8hM28资讯网——每日最新资讯28at.com

8hM28资讯网——每日最新资讯28at.com

位域注意

  • 结构体位域成员不能使用取址操作
  • 结构体成员不能够使用static修饰
  • 结构体位域成员不能使用数组。

不同的处理器,不同的编译器对位域的影响,位域虽然能够以位的形式操作数据,但是也被人们告知要慎重使用,原因在于不同的处理器结构,不同的编译器对于位域的一些特征会产生不同的结果。8hM28资讯网——每日最新资讯28at.com

8hM28资讯网——每日最新资讯28at.com

处理器大端模式,小端模式的处理器也会对下面的结构体位域产生不一样的存储方式。8hM28资讯网——每日最新资讯28at.com

不同的编译器,结构体位域成员不同类型,不同的编译器对于位域会有不同的结果8hM28资讯网——每日最新资讯28at.com

当成员大小之和超过一个基本存储空间时,不同的编译器也会有不同的处理方式。8hM28资讯网——每日最新资讯28at.com

typedefunion{    unsignedchar Byte;    struct    {        unsignedchar bit012 : 3;        unsignedchar bit34  : 2;        unsignedchar bit5   : 1;        unsignedchar bit6   : 1;        unsignedchar bit7   : 1;    }bits;}registerType;

存储0x0000 8000定义一个指针指向地址:8hM28资讯网——每日最新资讯28at.com

8hM28资讯网——每日最新资讯28at.com

registerType *pReg = (register*)0x00008000;// 使用位域寄存器进行赋值pReg->bits.bit5 = 1;pReg->bits.bit012 = 7;

本文链接:http://www.28at.com/showinfo-26-10474-0.htmlC语言操作寄存器和函数指针

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 利用开放接口,如何一步步打造自己的独特图片网站

下一篇: 优化自动化接口测试:利用钩子函数增强HTTP请求处理

标签:
  • 热门焦点
  • 6月安卓手机性价比榜:Note 12 Turbo断层式碾压

    6月份有一个618,虽然这是京东周年庆的日子,但别的电商也都不约而同的跟进了,反正促销没坏处,厂商和用户都能满意。618期间一些产品也出现了历史低价,那么各个价位段的产品性价比
  • 5月安卓手机好评榜:魅族20 Pro夺冠

    性能榜和性价比榜之后,我们来看最后的安卓手机好评榜,数据来源安兔兔评测,收集时间2023年5月1日至5月31日,仅限国内市场。第一名:魅族20 Pro好评率:97.50%不得不感慨魅族老品牌还
  • 六大权益!华为8月服务日开启:手机免费贴膜、维修免人工费

    8月5日消息,一年一度的华为开发者大会2023(Together)日前在松山湖拉开帷幕,与此同时,华为8月服务日也式开启,到店可享六大专属权益。华为用户可在华为商城Ap
  • 三言两语说透柯里化和反柯里化

    JavaScript中的柯里化(Currying)和反柯里化(Uncurrying)是两种很有用的技术,可以帮助我们写出更加优雅、泛用的函数。本文将首先介绍柯里化和反柯里化的概念、实现原理和应用
  • 深度探索 Elasticsearch 8.X:function_score 参数解读与实战案例分析

    在 Elasticsearch 中,function_score 可以让我们在查询的同时对搜索结果进行自定义评分。function_score 提供了一系列的参数和函数让我们可以根据需求灵活地进行设置。近期
  • 使用LLM插件从命令行访问Llama 2

    最近的一个大新闻是Meta AI推出了新的开源授权的大型语言模型Llama 2。这是一项非常重要的进展:Llama 2可免费用于研究和商业用途。(几小时前,swyy发现它已从LLaMA 2更名为Lla
  • 虚拟键盘 API 的妙用

    你是否在遇到过这样的问题:移动设备上有一个固定元素,当激活虚拟键盘时,该元素被隐藏在了键盘下方?多年来,这一直是 Web 上的默认行为,在本文中,我们将探讨这个问题、为什么会发生
  • 小红书1周涨粉49W+,我总结了小白可以用的N条涨粉笔记

    作者:黄河懂运营一条性教育视频,被54万人&ldquo;珍藏&rdquo;是什么体验?最近,情感博主@公主是用鲜花做的,火了!仅仅凭借一条视频,光小红书就有超过128万人,为她疯狂点赞!更疯狂的是,这
  • 雅柏威士忌多款单品价格大跌,泥煤顶流也不香了?

    来源 | 烈酒商业观察编 | 肖海林今年以来,威士忌市场开始出现了降温迹象,越来越多不断暴涨的网红威士忌也开始悄然回归市场理性。近日,LVMH集团旗下苏格兰威士忌品牌雅柏(Ardbeg
Top