来源于一次契机,因此决定记录下。一方面很多知识都只是停留在表面阶段,没有深入理解。因此决定写技术博客来总结。
1.使用一个宏实现输入两个参数并返回较小的一个
#define MIN(A,B) ((A)<=(B)?(A):(B))
2.嵌入式系统经常具有要求程序员去访问某特定的内存位置的特点。在某工程中,要求设置一绝对地址为0x67a9的整型变量的值为0xaa66。编译器是一个纯粹的ANSI编译器。写代码去完成这一任务
int * ptr;
ptr= (int *)0x67a9;
*ptr = 0xaa66;
3.在32位机器里运行,请问下面的结构体占多大空间
typedef struct
{
uint8_t a[5];
uint16_t b;
uint32_t c;
char * Ptr;
}AA
```c
答案是 16 4+4+4+4=16
4.堆栈的区别
堆:是自己分配的内存,主要用malloc函数创建和free函数销毁
栈:用作局部变量,形参
5.写个队列,包含入队和出队,判断队列满和空
#define QUEUE_MAXSIZE 5
typedef struct
{
uint8_t front;
uint8_t rear;
uint16_t arrayBuffer[QUEUE_MAXSIZE];
}Queue_Typedef
/**
* @brief 初始化队列
* @param None
* @retval None
* @note None
*/
void InitQueue(Queue_Typedef* aa)
{
aa->front=0;
aa->rear=0;
}
/**
* @brief 判断队列是不是满
* @param aa :结构体指针
* @retval 1:队列满 0:队列没有满
* @note None
*/
uint8_t IsFullQueue(Queue_Typedef* aa)
{
if((aa->rear+1)%QUEUE_MAXSIZE==aa->front) //队列满
{
return 1;
}
else
{
return 0;
}
}
/**
* @brief 判断队列是不是满
* @param aa :结构体指针
* @retval 1:队列满 0:队列没有满
* @note None
*/
uint8_t IsEmptyQueue(Queue_Typedef* aa)
{
if(aa->front==aa->rear) //队列空
{
return 1;
}
else
{
return 0;
}
}
/**
* @brief 入队列
* @param aa :结构体指针
* @retval None
* @note None
*/
void EnQueue(Queue_Typedef* aa,uin16_t value)
{
if(IsEmptyQueue(aa)==0) //如果队列不为满
{
aa->arrayBuffer[aa->rear]=value; //赋值
aa->rear=(aa->rear+1)%QUEUE_MAXSIZE; //移动队尾指针
}
}
/**
* @brief 出队列
* @param aa :结构体指针
* @retval None
* @note None
*/
void DeQueue(Queue_Typedef* aa uin16_t *e)
{
if(IsFullQueue(aa)==0) //如果队列不为空
{
*e=aa->arrayBuffer[aa->front]; //将队头元素赋值给e
aa->front=(aa->front+1)%QUEUE_MAXSIZE; //移动队尾指针
}
}
6.SPI的几种模式
SPI有4种模式,
CP是 空闲时刻的SCK高低电平。为0是低电平,为1是高电平
CL是奇数沿采样还是偶数沿采样。为0是奇数沿采样,为1是偶数沿采样
7.操作FLASH要注意的地方
1.尽可能减少擦除,在写内容到 FLASH之前,可以回读FLAH,比较回读内容和将要写的内容,要是一样的话那就没必要操作了
2.要及时加锁
3.写FLASH之前最好对内容做个CRC校验,写入FLASH后在回读内容计算校验码 ,判断是否正确写入