微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

2016年11月问题记录与总结

1.Flash在使用之前需要格式化成想要的文件系统,比如要使用dosfs或者ext4linux下使用mkfs指令先对已经分区好的分区进行格式化,然后再mount到挂载点,这样就可以方便的使用了。

 

2.#define PCIE_BASE 0x60000000和指针定义的*base = (void *)0x60000000在地址+i的时候,会有什么不同。

  前者地址+1,后者地址+4


3.硬中断和软中断的理解

     两者最大的差别在于硬中断是由硬件外设自动产生的,软中断是通过指令触发的。硬中断的中断号一般是硬件决定的,叫中断控制器,软中断是指令给出的。软中断不可嵌套,硬中断可以嵌套以及被打断。

 

4.C语言实现循环队列一个简单的例子。

my_queue.h

#ifndef __MY_QUEUE_H_
#define __MY_QUEUE_H_

#define u32 unsigned int
#define u16 unsigned short
#define TRUE	1
#define FALSE	0


typedef struct queue
{
	u32 *q_base;//队列栈的基地址
	u32 front;//指向队列中的第一个元素
	u32 rear;//指向队列中最后一个元素的下一个位置
	u32 max_size;//整个循环队列的最大空间
}my_queue,*p_queue;

typedef enum 
{
	FULL=0,EMPTY,NOT_EMPTY
}q_status;



u16 create_queue(p_queue Q,u32 max_size);
q_status check_q(p_queue Q);
void traverse_q(p_queue Q);
u16 enter_q(p_queue Q,int value);

#endif


my_queue.c

 
#include <stdio.h>
#include <string.h>
#include <memory.h>
#include <stdlib.h>
#include "my_queue.h"

/*创建一个内容为空的循环队列*/
u16 create_queue(p_queue Q,u32 max_size)
{
	Q->q_base=(u32 *)malloc(sizeof(int)*max_size);
	if(Q->q_base==NULL)
	{
		printf("malloc error!\n");
		return FALSE;
	}
	Q->front=0;
	Q->rear=0;
	Q->max_size=max_size;
	return TRUE;
}

/*判断队列状态*/
q_status check_q(p_queue Q)
{
	if(Q->front==Q->rear)
	{
		return EMPTY;
	}
	else if(Q->front==(Q->rear+1)%Q->max_size)
	{
		return FULL;
	}
	else
	{
		return NOT_EMPTY;
	}
}

/*遍历循环队列中的元素,打印出来*/
void traverse_q(p_queue Q)
{
	u32 i;
	i=Q->front;
	while((i%Q->max_size)!=Q->rear)
	{
		printf("Q[%d] value is:%d\n",i,Q->q_base[i]);
		i++;
	}

}



/*进队列*/
u16 enter_q(p_queue Q,int value)
{
	if(check_q(Q)==FULL)
	{
		printf("The queue is full!\n");		
		return FALSE;
	}
	
	Q->q_base[Q->rear]=value;
	Q->rear=(Q->rear+1)%Q->max_size;


	return TRUE;
}

/*出队列*/
u16 exit_q(p_queue Q,int* value)
{
	if(check_q(Q)==EMPTY)
	{
		printf("The queue is empty!\n");		
		return FALSE;
	}
	
	*value=Q->q_base[Q->front];

	Q->front=(Q->front+1)%Q->max_size;

	return TRUE;
}


p_queue test_queue;


int main(void)
{
	u32 a,i;

	memset(&test_queue,sizeof(my_queue));//初始化

	if(create_queue(&test_queue,20)!=TRUE)//创建队列并判断是是否创建成功
	{
		printf("create queue Failed!\n");
		exit(-1);
	}
	
	
	for(i=0;i<20;i++)//进队列
	{
		enter_q(&test_queue,i);
	}

	while(check_q(&test_queue)!=FULL);//判断状态为满

	traverse_q(&test_queue);//遍历队列元素,并打印出来

	for(i=0;i<20;i++)//出队列,并打印
	{
		exit_q(&test_queue,&a);
		printf("exit[%d]\n",a);
	}

	while(check_q(&test_queue)!=EMPTY);//判断是否为空


	a=getch();

	return 0;
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐