malloc分配内存,一般首先定义一个指针,然后将malloc函数返回的地址赋予该指针
u8 a;
u8 *P;
p = &a;
p = malloc(ram,1);
什么时候需要使用malloc申请内存?
定义了指针变量之后,要想使用它,(当然我们不是也不能因为定义了所以才使用它,而是应该因为要使用它所以才定义它)就得让它指向具体的内存,让它指向内存有两个办法:
1、就是用p=&a;或p=0x12324121这样的赋值语句为指针变量p赋值,即让其指向一个具体的内存地址(这个地址处的变量可能就是a),然后就可以引用指针来干事情了,例如
“*p= 5”就是让p指向的这个u8数据等于5;
2、就是使用malloc内存分配函数来让p指向一个具体的内存空间,p = malloc(ram,1);这个方法和上边的那个是不一样的,不一样的地方在于,上边的方法先定义一个变量a,再
将这个变量a的地址赋予这个指针变量p,这个变量a的地址在赋予这个指针变量p之前就是是确定的(当然,在这儿,我们使用“*p=5”相对于用“a=5”为a赋值来说有点无厘头,
之所以显得无厘头就是因为a的地址已经在定义a的时候确定了,我们完全可以直接为a赋值,而没必要非说向&a指向的内存中填5,什么时候才不会显得无厘
头,就是只定义了一个指针并对其赋了一个数字值的时候,就类似下边的32寄存器编程中一样,只是说TIM3的值是TIM3_BASE,没说TIM3指向哪个变量,这时,就可以有理由
的引用TIM3这个指针了,TIM3->ARR 、TIM3->PSC、TIM3->DIER)。
而第2种方法,是不确定的,随机的,这个原因,就要看malloc申请内存的机制了,这个malloc函数给我的感觉就是,在内存中找一块没有被用过的内存区域,看看参数中需要申请多少,
然后就截取多少,截取完之后把这一段内存的首地址返回,同时,标记这一段内存已经被使用(直到free函数将其释放,才能再次被申请)。
所以综上所述,一个指针变量,只要没有经过第一种方法直接为其赋值,那他这个指针变量必然是用来(“用来”而不是“要去”,我的认知中是“被动承接不是主动去要”)承接
malloc申请到的内存的首地址的,然后才能使用,否则其什么都不指向,用一个形象一点的例子说明就相当于,你是指挥官,命令士兵说,“往某某城市(某某城市相当于指针)发
射一枚导弹”,然后士兵肯定要知道这个城市的经纬度,假如你没告诉他经纬度,这个“某某城市”只是个能够代表任何经纬度的一个名词,无任何意义,那此时这个士兵肯定是懵逼
的。此时,你要告诉他具体经纬度了,用第一种方法,就是直接告诉他东经113:42北纬34:44,第二种,就相当于士兵就在那守着,你告诉他“某某城市需要轰炸一下”,然后你给他
一个U盘,士兵不需要知道这个U盘中存储的具体经纬度,也不需要知道轰炸的是一个城市还是一个岛屿,他只需要把这个U盘插在发射设备上,这个“某某城市”的指针就被赋予了
U盘这个malloc申请来的地址了。
#define PERIPH_BASE ((uint32_t)0x40000000) /*!< Peripheral base address in the alias region */
#define APB1PERIPH_BASE PERIPH_BASE
#define TIM3_BASE (APB1PERIPH_BASE + 0x0400)
#define TIM3 ((TIM_TypeDef *) TIM3_BASE)
typedef struct
{
__IO uint16_t CR1;
uint16_t RESERVED0;
__IO uint16_t CR2;
uint16_t RESERVED1;
__IO uint16_t SMCR;
uint16_t RESERVED2;
__IO uint16_t DIER;
uint16_t RESERVED3;
__IO uint16_t SR;
uint16_t RESERVED4;
__IO uint16_t EGR;
uint16_t RESERVED5;
__IO uint16_t CCMR1;
uint16_t RESERVED6;
__IO uint16_t CCMR2;
uint16_t RESERVED7;
__IO uint16_t CCER;
uint16_t RESERVED8;
__IO uint16_t CNT;
uint16_t RESERVED9;
__IO uint16_t PSC;
uint16_t RESERVED10;
__IO uint16_t ARR;
uint16_t RESERVED11;
__IO uint16_t RCR;
uint16_t RESERVED12;
__IO uint16_t CCR1;
uint16_t RESERVED13;
__IO uint16_t CCR2;
uint16_t RESERVED14;
__IO uint16_t CCR3;
uint16_t RESERVED15;
__IO uint16_t CCR4;
uint16_t RESERVED16;
__IO uint16_t BDTR;
uint16_t RESERVED17;
__IO uint16_t DCR;
uint16_t RESERVED18;
__IO uint16_t DMAR;
uint16_t RESERVED19;
} TIM_TypeDef;
void TIM3_Int_Init(u16 arr,u16 psc)
{
RCC->APB1ENR|=1<<1; //TIM3时钟使能
TIM3->ARR=arr; //设定计数器自动重装值//刚好1ms
TIM3->PSC=psc; //预分频器7200,得到10Khz的计数时钟
TIM3->DIER|=1<<0; //允许更新中断
TIM3->CR1|=0x01; //使能定时器3
MY_NVIC_Init(1,3,TIM3_IRQn,2);//抢占1,子优先级3,组2
}