博文

volatile(2006-11-18 11:06:00)

摘要:volatile的用法
避免编译器优化的用法 转自<海涛的笔记>   _lindwen


volatile的本意是“易变的”

由于访问寄存器的速度要快过RAM,所以编译器一般都会作减少存取外部RAM的优化。比如:

static int i=0;

int main(void)
{
...
while (1)
{
if (i) dosomething();
}
}

/* Interrupt service routine. */
void ISR_2(void)
{
i=1;
}

程序的本意是希望ISR_2中断产生时,在main当中调用dosomething函数,但是,由于编译器判断在main函数里面没有修改过i,因此
可能只执行一次对从i到某寄存器的读***作,然后每次if判断都只使用这个寄存器里面的“i副本”,导致dosomething永远也不会被
调用。如果将将变量加上volatile修饰,则编译器保证对此变量的读写***作都不会被优化(肯定执行)。此例中i也应该如此说明。

一般说来,volatile用在如下的几个地方:

1、中断服务程序中修改的供其它程序检测的变量需要加volatile;

2、多任务环境下各任务间共享的标志应该加volatile;

3、存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能由不同意义;

另外,以上这几种情况经常还要同时考虑数据的完整性(相互关联的几个标志读了一半被打断了重写),在1中可以通过关中断来实
现,2中可以禁止任务调度,3中则只能依靠硬件的良好设计了。



volatile 的含义
volatile总是与优化有关,编译器有一种技术叫做数据流分析,分析程序中的变量在哪里赋值、在哪里使用、在哪里失效,分析结果可以用于常量......

阅读全文(1879) | 评论:0

笔记(2006-11-17 20:11:00)

摘要:1 不区分大小写的 字符串比较
string.compare("需要比较的字符串1","需要比较的字符串2",true)=0
true 表示不区分大小写 false 表示区分大小写(为默认的)。
相等返回 0 2,字符串变大小写 “字符串”.ToLower        "字符串“.ToUpper 3......

阅读全文(1745) | 评论:0

转载的(2006-11-16 21:11:00)

摘要:1、我所认为的“幸福”其实是每个人心里的一种感受,但大部分人总会将自己所期望的或是得不到的“幸福”转交给别人,而我们每个人需要的幸福不可能是同一种,哪怕是一个人在不同时期所需要的也不会是完全一样的,我们常常被动地接受了别人的“幸福”,这习惯让我们开始厌倦了,所以在这样的环境中感到越来越不幸福了。还好不想长大也长大了,“幸福”更重要是自己的选择,我选择了活在当下,只要此时拥有的我都会觉得是幸福的,因为在下一刻也许就有很多东西我们不再拥有了,但失去也是幸福的,上帝永远都是公平的,当祂为你关上一扇门的时候,祂一定会为你在另一个地方开启一扇窗的。 2、成长来自改变,改变来自决心,决心来自信心 3、这世界并不会在意你的自尊,指望你在自我感觉良好之前先要有所成就 4、什麼樣的思想.什麼樣的生活. 什麼樣的選擇.什麼樣的結局. 5、树的方向由风决定,人的方向由自己决定 6、昨天下决心,今天努力,明天成功。扛过今天晚上就能成就之前的所有努力。成功,只在于再坚持一下的毅力中。 7、爱情是留给懂得爱自己的人的。爱,是爱慕,是感觉;情,是情感,是积累;爱情是一段旅程,是两张车票,是愿意一起驶往人生的尽头,而且包容体谅和懂得,相濡以沫,执手偕老。  
......

阅读全文(2113) | 评论:0

图的邻接矩阵创建算法(2006-05-08 23:08:00)

摘要:#include <iostream>
#include<stdio.h>
using namespace std;
#define FINITY 5000  //此处用5000代表最大
#define m 20         //最大顶点树
typedef char vertextype;  //顶点值类型
typedef int edgetype;       //权值类型 typedef struct
{
 vertextype vexs[m];      //顶点值类型
 edgetype edges[m][m];    //邻接矩阵
 int n,e;                //顶点总数 和 边树
}mgraph;                    //邻接矩阵表示的图类型
// 图的邻接矩阵创建算法   void createmgraph1(mgraph *g)
{
 int i,j,k,w;
 cout<<"\n输入图的顶点数:";
 cin>>g->n;
 cout<<"\n输入图的边数:";
 cin>>g->e;
 getchar();          &n......

阅读全文(5771) | 评论:0

线程的创建 ???(2006-04-20 20:18:00)

摘要:// 我创建了两个线程,本意是   要通过 临界区 实现  线程同步,  在这里 如果去掉 进入(或退出)临界区操作,   可以看到临界区的 作用 但如果都 去掉(即去掉临界区操作那部分) 或 都不 去掉 的话,结果一样, 知道的朋友帮忙改下怎么才能使 两个线程 随机  发生 ????????????     #include<iostream.h>
#include<windows.h> CRITICAL_SECTION hCritical; void display1()
{  
 
 EnterCriticalSection(&hCritical);
 cout<<"Thread1 is runing!"<<endl;
 LeaveCriticalSection(&hCritical);
} void display2()
{
     
 EnterCriticalSection(&hCritical);
 cout<<"Thread2 is runing!"<<endl;
 LeaveCriticalSection(&hCritical);
}   void main()
{
 
 InitializeCriticalSection(&hCritical);  static HANDLE hHandle1=NULL;
    static HANDLE hHandle2=NULL;
 DWORD dwThreadID1;
 while(1)
 {  hHandle1=CreateThread((LPSECURITY_ATTRIBUTES)NULL,
  0......

阅读全文(2463) | 评论:0

二叉树其他运算(2006-04-19 17:27:00)

摘要:#include <iostream>
using namespace std; typedef char datatype;
typedef struct node
{
 datatype data;
 struct node *lchild,*rchild;
}bintnode; typedef bintnode *bintree;
bintree root;                    //指向树根结点指针 // 二叉树的创建(按前序遍历顺序) void createbintree(bintree *t)
{
 char ch;
 if((ch=getchar())==' ')
  *t=NULL;
 else
 {
  *t=(bintnode*)malloc(sizeof(bintnode));
  (*t)->data=ch;
  createbintree(&(*t)->lchild);
  createbintree(&(*t)->rchild);
 }
}
//二叉树的查找算法 bintree locate(bintree t,datatype x)
{
 bintree p;
 if(t==NULL)
  return NULL;
 else
  if(t->data==x)
   return t;
  else
  {
   p=locate(t->lchild,......

阅读全文(2562) | 评论:0

二叉树各种非递归遍历(2006-04-13 19:34:00)

摘要:#include <iostream>
using namespace std; //二叉树链式存储的头文件
typedef char datatype;         //结点属性值类型
typedef struct node            //二叉树结点的类型
{
 datatype data;
 struct node* lchild,*rchild;
}bintnode;
typedef bintnode *bintree;
bintree root;                   //指向二叉树根结点指针 //下面是些栈的操作 为非递归实现做准备 typedef struct stack            //栈结构定义
{
 bintree data[100];          //data 元素类型为   指针
 int tag[100];               //为栈中元素作的标记,用于后序遍历
 int top;                    //栈顶指针
}......

阅读全文(7264) | 评论:0

树的层号表示转化为树的孩子表示(数组方式)(2006-04-11 23:43:00)

摘要:#include<iostream>
using namespace std;
#define m 3                        //树的度数
#define maxsize 50                 //数组元素个数最大值
typedef char datatype;           
typedef struct node                //树的扩充孩子表示(数组方式)法中结点类型 多了 双亲
{
 datatype data;
 int child[m];
 int parent;
}treenode; typedef struct                     //层号表示法中结点的类型
{
 int lev;
 datatype data;
}levelnode;                     treen......

阅读全文(3057) | 评论:0

树的括号表示转化为树的孩子(数组方式)表示方式(2006-04-10 20:28:00)

摘要://树的括号表示转换成树的孩子(数组方式)表示 算法
#include <iostream>
#include<stdio.h>
using namespace std;
#define m 3                 //树的度数
#define maxsize 20          //数的孩子表示法对应数组大小
#define bmaxsize 25       //树的括号表示对应数组大小 typedef char datatype;      //树中节点值类型
typedef struct node         //树的孩子表示法中节点类型
{
 datatype data;
 int child[m];
}treenode; treenode tree[maxsize];     //树的孩子表示法存储数组
int root;                   //根结点的下标
int length;                 //树中实际所含结点的个数        
char p[bmaxsize]; ......

阅读全文(3673) | 评论:0

一般树的 创建以及各种遍历(2006-04-04 23:09:00)

摘要:// 先按前序遍历创建一棵 三度 树,然后按 前序,后序,层次 遍历此树 #include <iostream>
using namespace std;
#define m 3 typedef char datatype;
typedef struct node
{
 datatype data;
 struct node* child[m];
}node,*tree;
tree root; // 按前序遍历 创建一棵度数为3的树的递归算法 void createtree(tree *p)               //*p 可以换成p 吗?
{
 int i;
 char ch;
 if((ch=getchar())==' ')  *p=NULL;   //建立一棵空树
 else
 {
  *p=(tree)malloc(sizeof(node));    //用new 怎么建立
  (*p)->data=ch;
  for(i=0;i<m;i++)
   createtree(&(*p)->child[i]);
 }
} //树的前序遍历递归算法 void preorder(tree p)  //P为指向树根的指针
{
 int i;
 if(p!=NULL)       //树不为空
 {
  cout<<p->data;           &nbs......

阅读全文(3646) | 评论:0