C语言系列——关键字

    从接触C语言到现在也有好几年了,这个在阅读ESC32源码的时候感觉自己差的还是很多的。里面运用的大量的宏定义,这样就加大的阅读的难度,但是这样就大大方便的维护,这应该是一个平衡问题吧。今天就C语言关键字简单的总结一下,试问:C语言有多少个关键字呢?

关键字

意义

 

 

auto

声明自动变量,缺省使编译器一般默认为auto

break

跳出当前循环

int

声明整形变量

register

声明寄存器变量

double

声明双精度变量

const

声明只读变量

long

声明长整型变量

volatile

说明变量在程序执行中可被隐含改变

char

声明字符型变量

typedef

用以给数据类型去别名

float

声明浮点型变量

extern

声明变量是在其他文件中声明

short

声明短整型变量

return

子程序返回语句

signed

声明有符号类型变量

void

声明函数无返回值或无参数,声明空类型指针

unsigned

声明无符号类型变量

continue

结束当前循环,开始下一轮循环

struct

声明结构体变量

do

循环语句的循环体

union

声明联合体数据类型

while

循环语句的循环条件

enum

声明枚举类型

if

条件语句

static

声明静态变量

else

条件语句否定分支

switch

用于开关语句

for

一种循环语句

case

开关语句分支

goto

无条件跳转语句

default

开关语句中的“其他分支”

sizeof

计算机对象所在内存空间大小

    在弄清上面这些关键字之前首先需要明白两个概念:什么是定义?什么是声明?它们有何区别?

    定义:是(编译器)创建一个对象,为这个对象分配一块内存并给它取上一个名字,这个名字就是我们经常所说的变量名。

    声明:1.告诉编译器,这个名字已经匹配一块内存上了

          2.告诉编译器,这个名字我先预定了,别的地方不能用它来作为变量名了

    定义跟声明最重要的区别:义创建了对象并为这个对象分配了内存,声明没有分配内存。

    1>    最快的关键字——register

    Register:这个关键字请求编译器尽可能的将变量存在CPU内部寄存器中为不是通过内存寻址访问,它声明的变量在程序中使用频率较高

    虽然寄存器的速度非常快,但是使用register修饰符也有限制的:register变量必须是一个单个的值,并且其长度用应小于或等于整型长度。而且register变量不能用取址运算符“&”来获取register变量的地址


    2>    最冤枉的关键字——sizeof

    sizeof是关键字不是函数,(我一直认为是函数,没想到确实关键字)为了证明它是关键字,我们借助编译器确 定它的身份,看下面的例子:

    注意:这个关键字更运行环境,硬件平台有关,所以判断数值之前必须考虑硬件平台,最好的办法就是基于相应的平台加以测试。


    3>    最易变的关键字——volatile

    volatile是易变的、不稳定的意思。用它修饰的变量表示可以被某些编译器未知的因素更改,比如操作系统、硬件或者其他线程等,遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问。


   4>    最会带帽子的关键字——extern

   extern,外面的、外来的意思。extern可以置于变量或者函数前,以标示变量或函数的定义在别的文件中,下面的代码用到的这些变量或函数是外来的,不是本文定义的,提示编译器遇到此变量和函数时在其他模块中寻找其定义。

 

    有些是我以前就用到的,只是没有深究,像基本数据类型的关键字这些就不用说了,基本会编程的人都懂。其中还有几个关键字如:struct、enum、typedef等这些也大量遇到,尤其这一些大型的程序中这些定义太常见,可以自己还是不敢用,主要是没有深入理解。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
/* This file is part of AutoQuad ESC32. AutoQuad ESC32 is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. AutoQuad ESC32 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with AutoQuad ESC32. If not, see . Copyright © 2011, 2012 Bill Nesbitt */ /* * pwm.c文件.此文件有2个功能,2个功能分别使用,不能同时使用 * 1、pwm in输入模式,pwm输入中断里,调用runNewInput函数 * 2、one wire通讯协议,pwm输入中断里,调用owEdgeDetect函数,来输入新的数据,调用owReset函数来复位1wire通讯 * */ #include "pwm.h" #include "timer.h" #include "run.h" #include "main.h" #include "ow.h" #include "stm32f10x_gpio.h" #include "stm32f10x_tim.h" #include "misc.h" static int16_t pwmMinPeriod; //timer1 ch1 pwm 输入最小周期 static int16_t pwmMaxPeriod; //timer1 ch1 pwm 输入最大周期 int16_t pwmMinValue; //timer1 ch2 pwm 输入最小周期 static int16_t pwmMaxValue; //timer1 ch2 pwm 输入最大周期 int16_t pwmLoValue; int16_t pwmHiValue; int16_t pwmMinStart; volatile uint32_t pwmValidMicros; //关闭输入捕获比较中断 1和2 void pwmIsrAllOff(void) { PWM_TIM->DIER &= (uint16_t)~(TIM_IT_CC1 | TIM_IT_CC2);//关闭中断 } //开启输入捕获比较中断 1和2 void pwmIsrAllOn(void) { PWM_TIM->CCR1; PWM_TIM->CCR2; PWM_TIM->DIER |= (TIM_IT_CC1 | TIM_IT_CC2);//允许捕获比较 1 2中断 } //开启捕获比较2中断 void pwmIsrRunOn(void) { uint16_t dier = PWM_TIM->DIER; dier &= (uint16_t)~(TIM_IT_CC1 | TIM_IT_CC2); dier |= TIM_IT_CC2;//允许捕获/比较2中断 PWM_TIM->CCR1; PWM_TIM->CCR2; PWM_TIM->DIER = dier; } //timer 1 void pwmInit(void) { GPIO_InitTypeDef GPIO_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; TIM_ICInitTypeDef TIM_ICInitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; pwmSetConstants(); // TIM1 channel 1 pin (PA.08) configuration GPIO_InitStructure.GPIO_Pin = PWM_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(PWM_PORT, &GPIO;_InitStructure); // Enable the TIM1 global Interrupt NVIC_InitStructure.NVIC_IRQChannel = PWM_IRQ; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC;_InitStructure); TIM_TimeBaseStructInit(&TIM;_TimeBaseStructure); TIM_TimeBaseStructure.TIM_Prescaler = (PWM_CLK_DIVISOR-1); TIM_TimeBaseStructure.TIM_Period = 0xffff; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(PWM_TIM, &TIM;_TimeBaseStructure); TIM_ICInitStructure.TIM_Channel = PWM_CHANNEL; TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; TIM_ICInitStructure.TIM_ICFilter = 0x0; TIM_PWMIConfig(PWM_TIM, &TIM;_ICInitStructure); // Select the TIM Input Trigger: TI1FP1 // 滤波后的定时器输入1(TI1FP1) TIM_SelectInputTrigger(PWM_TIM, TIM_TS_TI1FP1); // Select the slave Mode: Reset Mode TIM_SelectSlaveMode(PWM_TIM, TIM_SlaveMode_Reset);//复位模式 // Enable the Master/Slave Mode TIM_SelectMasterSlaveMode(PWM_TIM, TIM_MasterSlaveMode_Enable); // TIM enable counter TIM_Cmd(PWM_TIM, ENABLE); pwmIsrAllOn(); } //timer1 TIM1_CC_IRQHandler中断 void PWM_IRQ_HANDLER(void) { uint16_t pwmValue; uint16_t periodValue; uint8_t edge; edge = !(PWM_TIM->SR & TIM_IT_CC2); periodValue = PWM_TIM->CCR1; //IO 输入PA8 周期 pwmValue = PWM_TIM->CCR2; //IO 输入(但是没有看到配置了使用哪个IO做为输入了) 脉宽长度 // look for good RC PWM input if (inputMode == ESC_INPUT_PWM && //PWM输入模式 periodValue >= pwmMinPeriod && periodValue = pwmMinValue && pwmValue <= pwmMaxValue //脉宽长度 ) { if (edge == 0) { pwmValidMicros = timerMicros; runNewInput(pwmValue); //PWM正确.输入 } } } void pwmSetConstants(void) { float rpmScale = p[PWM_RPM_SCALE]; pwmMinPeriod = p[PWM_MIN_PERIOD] = (int)p[PWM_MIN_PERIOD];//PWM最小周期 timer1 ch1 pwmMaxPeriod = p[PWM_MAX_PERIOD] = (int)p[PWM_MAX_PERIOD];//PWM最大周期 timer1 ch1 pwmMinValue = p[PWM_MIN_VALUE] = (int)p[PWM_MIN_VALUE]; //PWM最小周期 timer1 ch2 pwmMaxValue = p[PWM_MAX_VALUE] = (int)p[PWM_MAX_VALUE]; //PWM最大周期 timer1 ch2 pwmLoValue = p[PWM_LO_VALUE] = (int)p[PWM_LO_VALUE]; pwmHiValue = p[PWM_HI_VALUE] = (int)p[PWM_HI_VALUE]; pwmMinStart = p[PWM_MIN_START] = (int)p[PWM_MIN_START]; if (rpmScale PWM_RPM_SCALE_MAX) rpmScale = PWM_RPM_SCALE_MAX; p[PWM_RPM_SCALE] = rpmScale; } ESC32开源电调 源码与原理图,此源码采用RTT操作系统,CAN PWM操作方式 ,本人已用PWM方式成功驱动起来,CAN 暂且还没做测试。 此资料是 啊嘉 开源出来的,好资料不敢独享,稍加整理放到这与大家共享。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值