搜索
bottom↓
回复: 466

不做设计开发了.但是还想做做贡献, 发一些以前用过的,看过的经典的技术, 大家学习学

[复制链接]

出0入0汤圆

发表于 2008-2-13 14:58:16 | 显示全部楼层 |阅读模式
1 . 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题)
#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL

2 . 写一个“标准”宏MIN ,这个宏输入两个参数并返回较小的一个。
#define MIN(A,B) ((A) <= (B) ? (A) : (B))  

3. 预处理器标识#error的目的是什么?
如果你不知道答案,请看参考文献1。这问题对区分一个正常的伙计和一个书呆子是很有用的。只有书呆子才会读C语言课本的附录去找出象这种问题的答案。当然如果你不是在找一个书呆子,那么应试者最好希望自己不要知道答案。
死循环(Infinite loops)

4. 嵌入式系统中经常要用到无限循环,你怎么样用C编写死循环呢?
while(1)
{
?}

5. 用变量a给出下面的定义
a) 一个整型数(An integer)   int a;
b)一个指向整型数的指针( A pointer to an integer)  int *a;
c)一个指向指针的的指针,它指向的指针是指向一个整型数( A pointer to a pointer to an integer) int **a;
d)一个有10个整型数的数组( An array of 10 integers)  int a[10];
e) 一个有10个指针的数组,该指针是指向一个整型数的。(An array of 10 pointers to integers) int *a[10];
f) 一个指向有10个整型数数组的指针( A pointer to an array of 10 integers)  int (*a)[10];
g) 一个指向函数的指针,该函数有一个整型参数并返回一个整型数(A pointer to a function that takes an integer as an argument and returns an integer) int (*a)(int)
h)一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数( An array of ten pointers to functions that take an integer argument and return an integer ) int (*a[10])(int);

6. 关键字static的作用是什么?
在C语言中,关键字static有三个明显的作用:
在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。
在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。
在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。
大多数应试者能正确回答第一部分,一部分能正确回答第二部分,同是很少的人能懂得第三部分。这是一个应试者的严重的缺点,因为他显然不懂得本地化数据和代码范围的好处和重要性。

7.关键字const有什么含意?
去年Dan Saks已经在他的文章里完全概括了const的所有用法,因此ESP(译者:Embedded Systems Programming)的每一位读者应该非常熟悉const能做什么和不能做什么.如果你从没有读到那篇文章,只要能说出const意味着“只读”就可以了。尽管这个答案不是完全的答案,但我接受它作为一个正确的答案。
下面的声明都是什么意思?
const int a; a是一个常整型数。
int const a; a是一个常整型数。
const int *a;  a是一个指向常整型数的指针(也就是,整型数是不可修改的,但指针可以)
int * const a; a是一个指向整型数的常指针(也就是说,指针指向的整型数是可以修改的,但指针是不可修改的)
int const * a const; a是一个指向常整型数的常指针(也就是说,指针指向的整型数是不可修改的,同时指针也是不可修改的)
关键字const的作用是为给读你代码的人传达非常有用的信息,实际上,声明一个参数为常量是为了告诉了用户这个参数的应用目的。如果你曾花很多时间清理其它人留下的垃圾,你就会很快学会感谢这点多余的信息。
通过给优化器一些附加的信息,使用关键字const也许能产生更紧凑的代码。

合理地使用关键字const可以使编译器很自然地保护那些不希望被改变的参数,防止其被无意的代码修改。简而言之,这样可以减少bug的出现。
8. 关键字volatile有什么含意?并给出三个不同的例子。

一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子:
1并行设备的硬件寄存器(如:状态寄存器)
2一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)
3多线程应用中被几个任务共享的变量  
?; 一个参数既可以是const还可以是volatile吗?解释为什么。
?; 一个指针可以是volatile 吗?解释为什么。
?; 下面的函数有什么错误:
int square(volatile int *ptr)
{
return *ptr * *ptr;
}

下面是答案:
?; 是的。一个例子是只读的状态寄存器。它是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。
?; 是的。尽管这并不很常见。一个例子是当一个中服务子程序修该一个指向一个buffer的指针时。
?; 这段代码有点变态。这段代码的目的是用来返指针*ptr指向值的平方,但是,由于*ptr指向一个volatile型参数,编译器将产生类似下面的代码:
int square(volatile int *ptr)  
{
int a,b;
a = *ptr;
b = *ptr;
return a * b;
}

由于*ptr的值可能被意想不到地该变,因此a和b可能是不同的。结果,这段代码可能返不是你所期望的平方值!正确的代码如下:
long square(volatile int *ptr)  
{
int a;
a = *ptr;
return a * a;
}
位操作(Bit manipulation)  

9. 嵌入式系统总是要用户对变量或寄存器进行位操作。给定一个整型变量a,写两段代码,第一个设置a的bit 3,第二个清除a 的bit 3。在以上两个操作中,要保持其它位不变。
#define BIT3 (0x1 << 3)
static int a;
void set_bit3(void) {
a |= BIT3;
}
void clear_bit3(void) {
a &= ~BIT3;
}
访问固定的内存位置(Accessing fixed memory locations)  

10. 嵌入式系统经常具有要求程序员去访问某特定的内存位置的特点。在某工程中,要求设置一绝对地址为0x67a9的整型变量的值为0xaa66。编译器是一个纯粹的ANSI编译器。写代码去完成这一任务。
这一问题测试你是否知道为了访问一绝对地址把一个整型数强制转换(typecast)为一指针是合法的。这一问题的实现方式随着个人风格不同而不同。典型的类似代码如下:
int *ptr;
ptr = (int *)0x67a9;
*ptr = 0xaa55;
A more obscure approach is:  
一个较晦涩的方法是:
*(int * const)(0x67a9) = 0xaa55;
即使你的品味更接近第二种方案,但我建议你在面试时使用第一种方案。
中断(Interrupts)  

11. 中断是嵌入式系统中重要的组成部分,这导致了很多编译开发商提供一种扩展—让标准C支持中断。具代表事实是,产生了一个新的关键字__interrupt。下面的代码就使用了__interrupt关键字去定义了一个中断服务子程序(ISR),请评论一下这段代码的。
__interrupt double compute_area (double radius)  
{
double area = PI * radius * radius;
printf("\nArea = %f", area);
return area;
}
?; ISR 不能返回一个值。如果你不懂这个,那么你不会被雇用的。
?; ISR 不能传递参数。如果你没有看到这一点,你被雇用的机会等同第一项。
?; 在许多的处理器/编译器中,浮点一般都是不可重入的。有些处理器/编译器需要让额处的寄存器入栈,有些处理器/编译器就是不允许在ISR中做浮点运算。此外,ISR应该是短而有效率的,在ISR中做浮点运算是不明智的。
?; 与第三点一脉相承,printf()经常有重入和性能上的问题。如果你丢掉了第三和第四点,我不会太为难你的。不用说,如果你能得到后两点,那么你的被雇用前景越来越光明了。

代码例子(Code examples)
12 . 下面的代码输出是什么,为什么?
void foo(void)
{
unsigned int a = 6;
int b = -20;
(a+b > 6) ? puts("> 6") : puts("<= 6");
}
这个问题测试你是否懂得C语言中的整数自动转换原则,我发现有些开发者懂得极少这些东西。不管如何,这无符号整型问题的答案是输出是 ”>6”。原因是当表达式中存在有符号类型和无符号类型时所有的操作数都自动转换为无符号类型。 因此-20变成了一个非常大的正整数,所以该表达式计算出的结果大于6。这一点对于应当频繁用到无符号数据
类型的嵌入式系统来说是丰常重要的。如果你答错了这个问题,你也就到了得不到这份工作的边缘。
13. 评价下面的代码片断:

unsigned int zero = 0;
unsigned int compzero = 0xFFFF;  
/*1's complement of zero */
对于一个int型不是16位的处理器为说,上面的代码是不正确的。应编写如下:
unsigned int compzero = ~0;

动态内存分配(Dynamic memory allocation)  
14. 尽管不像非嵌入式计算机那么常见,嵌入式系统还是有从堆(heap)中动态分配内存的过程的。那么嵌入式系统中,动态分配内存可能发生的问题是什么?
这里,我期望应试者能提到内存碎片,碎片收集的问题,变量的持行时间等等。这个主题已经在ESP杂志中被广泛地讨论过了(主要是 P.J. Plauger, 他的解释远远超过我这里能提到的任何解释),所有回过头看一下这些杂志吧!让应试者进入一种虚假的安全感觉后,我拿出这么一个小节目:
下面的代码片段的输出是什么,为什么?
char *ptr;
if ((ptr = (char *)malloc(0)) ==  
NULL)  
else
puts("Got a null pointer");
puts("Got a valid pointer");
该代码的输出是“Got a valid pointer”。

Typedef  
15 Typedef 在C语言中频繁用以声明一个已经存在的数据类型的同义字。也可以用预处理器做类似的事。例如,思考一下下面的例子:
#define dPS struct s *
typedef struct s * tPS;
以上两种情况的意图都是要定义dPS 和 tPS 作为一个指向结构s指针。哪种方法更好呢?(如果有的话)为什么?
这是一个非常微妙的问题,任何人答对这个问题(正当的原因)是应当被恭喜的。答案是:typedef更好。思考下面的例子:
dPS p1,p2;
tPS p3,p4;
第一个扩展为
struct s * p1, p2;
上面的代码定义p1为一个指向结构的指,p2为一个实际的结构,这也许不是你想要的。第二个例子正确地定义了p3 和p4 两个指针。
晦涩的语法


16 . C语言同意一些令人震惊的结构,下面的结构是合法的吗,如果是它做些什么?
int a = 5, b = 7, c;
c = a+++b;
这个问题将做为这个测验的一个愉快的结尾。不管你相不相信,上面的例子是完全合乎语法的。问题是编译器如何处理它?水平不高的编译作者实际上会争论这个问题,根据最处理原则,编译器应当能处理尽可能所有合法的用法。因此,上面的代码被处理成:
c = a++ + b;
因此, 这段代码持行后a = 6, b = 7, c = 12。

出0入0汤圆

发表于 2008-2-13 15:03:41 | 显示全部楼层
看看

出0入0汤圆

 楼主| 发表于 2008-2-13 15:06:53 | 显示全部楼层
很基础的, 最开始学习的, 这个main程序能使得端口B上的0xC3 的灯产生0.5s的亮灭。


用TIME0产生0.5s的中断。

首先预分频1024   
14.7456M/1024=14.444KHz

一个脉冲的周期为1/14.4444k=69.44us
既是每隔69.44us 计数器加1计数。

定时器0为8位的,可以计数256个   则最大计数为256*69.44us=17.7777ms
我们要500ms  则要开发全局计数器

我们用10ms产生中断,全局计数器要500/10=50次后触发LED。

我们用10ms/69.44us=144(10ms的中断), 256-144=112为计数器的初值。

所以timecount=50


//ICC-AVR application builder : 2006-7-13 16:11:26
// Target : M128
// Crystal: 14.7456Mhz

#include <iom128v.h>
#include <macros.h>

unsigned int timecount=0;

void port_init(void)
{
PORTA = 0x00;
DDRA  = 0x00;
PORTB = 0xFF;
DDRB  = 0xFF; //B端口输出,初值为FF
PORTC = 0x00; //m103 output only
DDRC  = 0x00;
PORTD = 0x00;
DDRD  = 0x00;
PORTE = 0x00;
DDRE  = 0x00;
PORTF = 0x00;
DDRF  = 0x00;
PORTG = 0x00;
DDRG  = 0x00;
}


//TIMER0 initialize - prescale:1024
// WGM: Normal
// desired value: 14.44444444KHz
// actual value: -0.001KHz (1444544.4%)
void timer0_init(void)
{
TCCR0 = 0x00; //stop
ASSR  = 0x00; //set async mode
TCNT0 = 0x00; //set count
OCR0  = 0x00;
TCCR0 = 0x07; //start timer 预分频为1024
}

#pragma interrupt_handler timer0_ovf_isr:17
void timer0_ovf_isr(void)
{
TCNT0 =112; //reload counter value置计数初值112
if (++timecount==50)//软件计数器为50
{
     PORTB=PORTB^0xc3; //取反
         timecount=0;
}
}


//call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
XDIV  = 0x00; //xtal divider
XMCRA = 0x00; //external memory
port_init();
timer0_init();

MCUCR = 0x00;
EICRA = 0x00; //extended ext ints
EICRB = 0x00; //extended ext ints
EIMSK = 0x00;
TIMSK = 0x00; //timer interrupt sources
ETIMSK = 0x00; //extended timer interrupt sources
SEI(); //re-enable interrupts
//all peripherals are now initialized
}

void main(void)
{
  port_init();
  timer0_init();
  init_devices();
  TIMSK=0x01;
  #asm("sei")
  while(1)
  {
    ;
  }
}

出0入0汤圆

 楼主| 发表于 2008-2-13 15:10:01 | 显示全部楼层
利用定时器产生不同占空比的PWM波形输出.
//ICC-AVR application builder : 2006-7-14 16:54:48
// Target : M128
// Crystal: 14.7456Mhz

#include <iom128v.h>
#include <macros.h>

//#define PWM_select  (PINC&3)

void port_init(void)
{
PORTA = 0xFF;
DDRA  = 0x00;
PORTB = 0xFF;
DDRB  = 0xFF;
PORTC = 0x03; //输入,上拉电阻使能
DDRC  = 0xFf;
PORTD = 0xFF;
DDRD  = 0x00;
PORTE = 0xFF;
DDRE  = 0x00;
PORTF = 0xFF;
DDRF  = 0x00;
PORTG = 0x1F;
DDRG  = 0x00;
}

//TIMER1 initialisation - prescale:8
// WGM: 0) Normal, TOP=0xFFFF
// desired value: 1Hz
// actual value: Out of range
void timer1_init(void)
{
TCCR1B = 0x00; //stop
TCNT1H = 0x00 /*INVALID SETTING*/; //setup
TCNT1L = 0x00 /*INVALID SETTING*/;
OCR1AH = 0x00 /*INVALID SETTING*/;
OCR1AL = 0x00 /*INVALID SETTING*/;
OCR1BH = 0x00 /*INVALID SETTING*/;
OCR1BL = 0x00 /*INVALID SETTING*/;
OCR1CH = 0x00 /*INVALID SETTING*/;
OCR1CL = 0x00 /*INVALID SETTING*/;
ICR1H  = 0x00 /*INVALID SETTING*/;
ICR1L  = 0x00 /*INVALID SETTING*/;
TCCR1A = 0x91;//8位PWM,
TCCR1B = 0x02; //预分频8
}

//call this routine to initialise all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
XDIV  = 0x00; //xtal divider
XMCRA = 0x00; //external memory
port_init();
timer1_init();

MCUCR = 0x00;
EICRA = 0x00; //extended ext ints
EICRB = 0x00; //extended ext ints
EIMSK = 0x00;
TIMSK = 0x00; //timer interrupt sources
ETIMSK = 0x00; //extended timer interrupt sources
SEI(); //re-enable interrupts
//all peripherals are now initialised
}

void main(void)
{
  unsigned int oldtogs; //storage for past walue of input
unsigned int PWM_select=3;
  port_init();
  timer1_init();
  init_devices();

  while(1)
  {
//   if (PWM_select !=oldtogs)
//        {
//           oldtogs=PWM_select;
           switch (PWM_select)
           {
             case 0:
                    OCR1A=25;  //10%
                        break;
             case 1:
                    OCR1A=51;  //20%
                        break;               
                 case 2:
                    OCR1A=76;  //30%
                        break;
                 case 3:
                    OCR1A=102;  //40%
                        break;
                }
//        }
   }
}

出0入0汤圆

 楼主| 发表于 2008-2-13 15:12:29 | 显示全部楼层
使能输入捕捉功能, 测量计算输入的脉冲宽度:

//ICC-AVR application builder : 2006-7-14 10:13:46
// Target : M128
// Crystal: 14.7456Mhz

#include <iom128v.h>
#include <macros.h>

//define PORT B as output for pulse width
#define pulse_out PORTB

//define ICP so we can read the pin
#define ICP PIND4

unsigned char ov_counter;
unsigned int  rising_edge, falling_edge;
unsigned long pulse_clocks;

void port_init(void)
{
PORTA = 0x00;
DDRA  = 0x00;
PORTB = 0xFF;
DDRB  = 0xFF;
PORTC = 0x00; //m103 output only
DDRC  = 0x00;
PORTE = 0x00;
DDRE  = 0x00;
PORTF = 0x00;
DDRF  = 0x00;
PORTG = 0x00;
DDRG  = 0x00;
}

//TIMER0 initialize - prescale:1024
// WGM: Normal
// desired value: 14.44444444KHz
// actual value: -0.001KHz (1444544.4%)
void timer1_init(void)
{
TCCR1B = 0xc4; //start timer 预分频为64
}

#pragma interrupt_handler timer1_ovf_isr:15
void timer1_ovf_isr(void)
{
  ov_counter++;
}

#pragma interrupt_handler timer1_capt_isr:13
void timer1_capt_isr(void)
{
if (ICP)
{
  rising_edge=ICR1;  //save start time for pulse
  TCCR1B&=0xBF; //set to trigger on falling edge next
  ov_counter=0;
}

else
{
  falling_edge =ICR1;
  TCCR1B|=0x40;
  pulse_clocks= (unsigned long) falling_edge - (unsigned long) rising_edge
                +(unsigned long) ov_counter*0x10000;
  pulse_out=pulse_clocks/230;
}
}
  

//call this routine to initialise all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
XDIV  = 0x00; //xtal divider
XMCRA = 0x00; //external memory
port_init();

MCUCR = 0x00;
EICRA = 0x00; //extended ext ints
EICRB = 0x00; //extended ext ints
EIMSK = 0x00;
TIMSK = 0x00; //timer interrupt sources
ETIMSK = 0x00; //extended timer interrupt sources
SEI(); //re-enable interrupts
//all peripherals are now initialised
}

void main(void)
{
  port_init();
  init_devices();
  timer1_init();
  TIMSK=0x24;
  SEI();
  while(1)
  {
   ;
  }
}

出0入0汤圆

 楼主| 发表于 2008-2-13 15:18:28 | 显示全部楼层
break 和continue的区别:


//求数组中正数的和。
for (i=0;i<10;i++)
{
if(a<0)
continue;//continue 只是结束本次循环,不影响整个循环,条件满足时候,本次循环结束,
//遇到continue语句时候,不执行他后面的语句,将负数舍弃。然后转向if循环语句。
  aa+=a;
}


//求调和级数中第多少项的值大于4
//   1+1/2+1/3+1/4+1/5+......+1/n;

sum+=1.0/n;
if(sum>LIMIT)  break;  n++;       //break和if语句一起用,当条件满足时候,for循环终止,
                                  // 他终止整个循环。。
                                   //用在switch语句中只是结束swith语句。不影响循环;n=31;
}

出0入0汤圆

发表于 2008-2-13 15:20:46 | 显示全部楼层
谢谢啊!

出0入0汤圆

 楼主| 发表于 2008-2-13 15:25:41 | 显示全部楼层
//排序,每次从数组中找出最小的数据,与第一位调换,然后在找出最小的数据,与第二位调换。
for(i=0;i<9;i++)
{
   r=i;
   for(j=i+1;j<10;j++){
    if(a[j]<a[r]) r=j;
        if(r!=i)  {temp=a;a=a[r];a[r]=temp;   }}
}

//求数组中的最大值
int max(int *x, int n)//x是指向数组的指针,n是数组个数

{
   int *p, m;
   m=*x;
   for(p=x+1; p<x+n;p++)
   if(*p>m)  m=*p; return(m);
}
两数交换
void swap(int *x,int *y)
{
   int temp;
   temp=*x;
   *x=*y;
   *y=temp;
   temp=0;//交换了形式参数x  y的值,a,b,的值交换。指针
}

//返回字符串的长度  指针实现
int str_len(char *s)
{
char *p;
p=s;//p指向数组的首地址,s的位置不变
while(*p!='\0')//===  while(*p)
p++;
return(p-s);
}

m128  晶振14.7456标准延时子程序:

//============================================================================
//    延时子程序(毫秒)
//============================================================================
void delay_ms(unsigned int t)
{
   unsigned int i=0;
   for(i=0;i<t;i++){
      delay(982);
            WDR();
   }          
}
//============================================================================
//    延时子程序(微秒)
//============================================================================
void delay(unsigned int t)  
{  asm("push r24");
          asm("in r24,0x3f");
          asm("push r24");
          asm("push r25");
          asm("clr r24");
          asm("clr r25");
          asm("_loopu::nop");
          asm("nop");
          asm("nop");
          asm("nop");
          asm("nop");
          asm("nop");
          asm("nop");  
          asm("nop");
          asm("nop");
          asm("subi r24,-1");
          asm("sbci r25,-1");
          asm("cp  r24,%t");
          asm("cpc r25,r17");
          asm("brlo _loopu");
          asm("pop r25");
          asm("pop r24");
          asm("out 0x3f,r24");
          asm("pop r24");
}

出0入0汤圆

 楼主| 发表于 2008-2-13 15:38:07 | 显示全部楼层
谢谢3楼.
刚刚发了,但是没有发出去.又要重新贴.晕了.
以后自己说不定也还能用到:
面试笔试可能有的考题:

1、基尔霍夫定理的内容是什么?
基尔霍夫定律包括电流定律和电压定律。
电流定律:在集总电路中,任何时刻,对任一节点,所有流出节点的支路电流的代数和恒等于零。
电压定律:在集总电路中,任何时刻,沿任一回路,所有支路电压的代数和恒等于零。

2、描述反馈电路的概念,列举他们的应用。
反馈,就是在电子系统中,把输出回路中的电量输入到输入回路中去。
反馈的类型有:电压串联负反馈、电流串联负反馈、电压并联负反馈、电流并联负反馈。
负反馈的优点:降低放大器的增益灵敏度,改变输入电阻和输出电阻,改善放大器的线性和非线性失真,有效

地扩展放大器的通频带,自动调节作用。
电压负反馈的特点:电路的输出电压趋向于维持恒定。
电流负反馈的特点:电路的输出电流趋向于维持恒定。

3、有源滤波器和无源滤波器的区别
无源滤波器:这种电路主要有无源元件R、L和C组成
有源滤波器:集成运放和R、C组成,具有不用电感、体积小、重量轻等优点。
集成运放的开环电压增益和输入阻抗均很高,输出电阻小,构成有源滤波电路后还具有一定的电压放大和缓冲

作用。但集成运放带宽有限,所以目前的有源滤波电路的工作频率难以做得很高。

1、同步电路和异步电路的区别是什么?

同步电路:存储电路中所有触发器的时钟输入端都接同一个时钟脉冲源,因而所有触发器的状态的变化都与所

加的时钟脉冲信号同步。
异步电路:电路没有统一的时钟,有些触发器的时钟输入端与时钟脉冲源相连,这有这些触发器的状态变化与

时钟脉冲同步,而其他的触发器的状态变化不与时钟脉冲同步。

2、什么是"线与"逻辑,要实现它,在硬件特性上有什么具体要求?

答:线与逻辑是两个输出信号相连可以实现与的功能。在硬件上,要用oc门来实现(漏极或者集电极开路),,由

于不用oc门可能使灌电流过大,而烧坏逻辑门。 同时在输出端口应加一个上拉电阻.(线或则是下拉电阻) 。OC

门,又称集电极开路(漏极开路)与非门门电路,Open Collector(Open Drain)。为什么引入OC门?实际使

用中,有时需要两个或两个以上与非门的输出端连接在同一条导线上,将这些与非门上的数据(状态电平)用

同一条导线输送出去。因此,需要一种新的与非门电路--OC门来实现“线与逻辑”。OC门主要用于3个方面: 1

、实现与或非逻辑,用做电平转换,用做驱动器。由于OC门电路的输出管的集电极悬空,使用时需外接一个上

拉电阻Rp到电源VCC。OC门使用上拉电阻以输出高电平,此外为了加大输出引脚的驱动能力,上拉电阻阻值的选

择原则,从降低功耗及芯片的灌电流能力考虑应当足够大;从确保足够的驱动电流考虑应当足够小。2、线与逻

辑,即两个输出端(包括两个以上)直接互连就可以实现“AND”的逻辑功能。在总线传输等实际应用中需要多

个门的输出端并联连接使用,而一般TTL门输出端并不能直接并接使用,否则这些门的输出管之间由于低阻抗形

成很大的短路电流(灌电流),而烧坏器件。在硬件上,可用OC门或三态门(ST门)来实现。 用OC门实现线与

,应同时在输出端口应加一个上拉电阻。3、 三态门(ST门)主要用在应用于多个门输出共享数据总线,为避

免多个门输出同时占用数据总线,这些门的使能信号(EN)中只允许有一个为有效电平(如高电平),

3、解释setup和hold time violation,画图说明,并说明解决办法。
Setup/hold time是测试芯片对输入信号和时钟信号之间的时间要求。建立时间是指触发器的时钟信号上升沿到

来以前,数据稳定不变的时间。输入信号应提前时钟上升沿(如上升沿有效)T时间到达芯片,这个T就是建立

时间-Setup time.如不满足setup time,这个数据就不能被这一时钟打入触发器,只有在下一个时钟上升沿,数

据才能被打入触发器。
保持时间是指触发器的时钟信号上升沿到来以后,数据稳定不变的时间。如果hold time不够,数据同样不能被

打入触发器。建立时间(Setup Time)和保持时间(Hold time)。
建立时间是指在时钟边沿前,数据信号需要保持不变的时间。
保持时间是指时钟跳变边沿后数据信号需要保持不变的时间。
如果数据信号在时钟沿触发前后持续的时间均超过建立和保持时间,那么超过量就分别被称为建立时间裕量和

保持时间裕量。

4、什么是竞争与冒险现象?怎样判断?如何消除?
在组合逻辑中,由于门的输入信号通路中经过了不同的延时,导致到达该门的时间不一致叫竞争。
产生毛刺叫冒险。
如果布尔式中有相反的信号则可能产生竞争和冒险现象。
解决方法:一是添加布尔式的消去项,二是在芯片外部加电容。

5、名词:SRAM、SSRAM、SDRAM
SRAM:静态RAM
DRAM:动态RAM
SSRAM:Synchronous Static Random Access Memory同步静态随机访问存储器。
它的一种类型的SRAM。SSRAM的所有访问都在时钟的上升/下降沿启动。地址、数据输入和其它控制信号均于时

钟信号相关。这一点与异步SRAM同,异步SRAM的访问独立于时钟,数据输入和输出都由地址的变化控制。
SDRAM:Synchronous DRAM同步动态随机存储器

6、FPGA和ASIC的概念他们的区别。
答案:FPGA是可编程ASIC。
ASIC:专用集成电路,它是面向专门用途的电路,专门为一个用户设计和制造的。根据一个用户的特定要求,

能以低研制成本,短、交货周期供货的全定制,半定制集成电路。与门阵列等其它ASIC(Application Specific

IC)相比,它们又具有设计开发周期短、设计制造成本低、开发工具先进、标准产品无需测试、质量稳定以及可

实时在线检验等优点

8、单片机上电后没有运转,首先要检查什么?
首先应该确认电源电压是否正常。
接下来就是检查复位引脚电压是否正常。分别测量按下复位按钮和放开复位按钮的电压值,看是否正确。
然后再检查晶振是否起振了,一般用示波器来看晶振引脚的波形,注意应该使用示波器探头的“X10”档。
另一个办法是测量复位状态下的IO口电平,按住复位键不放,然后测量IO口(没接外部上拉的P0口除外)的电

压,看是否是高电平,如果不是高电平,则多半是因为晶振没有起振。另外还要意的地方是,如果使用片内ROM

的话(大部分情况下如此,现在已经很少有用外部扩ROM的了),一定要将EA引脚拉高,否则会出现程序乱跑的

情况。有时用仿真器可以,而烧入片子不行,往往是因为EA引脚没拉高的缘故(当然,晶振没起振也是原因只

一)。如果系统不稳定的话,有时是因为电源滤波不好导致的。在单片机的电源引脚跟地引脚之间接上一个

0.1uF的电容会有所改善。如果电源没有滤波电容的话,则需要再接一个更大滤波电容,例如220uF的。遇到系

统不稳定时,就可以并上电容试试(越靠近芯片越好)

10、你知道那些常用逻辑电平?TTL与COMS电平可以直接互连吗?
常用逻辑电平:12V,5V,3.3V;TTL和CMOS不可以直接互连,由于TTL是在0.3-3.6V之间,而CMOS则是有在12V

的有在5V的。CMOS输出接到TTL是可以直接互连。TTL接到CMOS需要在输出端口加一上拉电阻接到5V或者12V。

cmos的高低电平分别为:Vih>=0.7VDD,Vil<=0.3VDD;Voh>=0.9VDD,Vol<=0.1VDD,ttl的

为:Vih>=2.0v,Vil<=0.8v;Voh>=2.4v,Vol<=0.4v.
11如何解决亚稳态。
亚稳态是指触发器无法在某个规定时间段内达到一个可确认的状态。当一个触发器进入亚 稳态时,既无法预测

该单元的输出电平,也无法预测何时输出才能稳定在某个正确的电平 上。在这个稳定期间,触发器输出一些中

间级电平,或者可能处于振荡状态,并且这种无用的输出电平可以沿信号通道上的各个触发器级联式传播下去



12、IC设计中同步复位与 异步复位的区别。

同步复位可靠性较高,对毛刺有免疫能力,但所用的资源比较多;异步复位因是电平敏感的,会因为复位信号

上的毛刺导致误动作,但消耗资源较少。不过,目前全局复位一般使用异步复位。
同步复位就是指复位信号只有在时钟上升沿到来时,才能有效。否则,无法完成对系统的复位工作
异步复位:它是指无论时钟沿是否到来,只要复位信号有效,就对系统进行复位。
二、各自的优缺点:
    1、总的来说,同步复位的优点大概有3条:
a、有利于仿真器的仿真。
b、可以使所设计的系统成为100%的同步时序电路,这便大大有利于时序分析,而且综合出来的fmax一般较高
c、因为他只有在时钟有效电平到来时才有效,所以可以滤除高于时钟频率的毛刺。
  他的缺点主要有以下几条:
    a、复位信号的有效时长必须大于时钟周期,才能真正被系统识别并完成复位任务。同时还要考虑,诸如:

clk skew,组合逻辑路径延时,复位延时等因素。
    b、由于大多数的逻辑器件的目标库内的DFF都只有异步复位端口,所以,倘若采用同步复位的话,综合器

就会在寄存器的数据输入端口插入组合逻辑,这样就会耗费较多的逻辑资源
  2、对于异步复位来说,他的优点也有三条,都是相对应的:
    a、大多数目标器件库的dff都有异步复位端口,因此采用异步复位可以节省资源。
    b、设计相对简单。
    c、异步复位信号识别方便,而且可以很方便的使用FPGA的全局复位端口GSR。
    缺点:
    a、在复位信号释放(release)的时候容易出现问题。具体就是说:倘若复位释放时恰恰在时钟有效沿附近

,就很容易使寄存器输出出现亚稳态,从而导致亚稳态。
   b、复位信号容易受到毛刺的影响。
三、总结:
一般都推荐使用异步复位,同步释放的方式,而且复位信号低电平有效。这样就可以两全其美了

出0入0汤圆

 楼主| 发表于 2008-2-13 15:41:50 | 显示全部楼层
此程序利用定时器3 在OC3B引脚上产生一个320HZ的正弦波电压:

//ICC-AVR application builder : 2006-8-4 11:06:22
// Target : M128
// Crystal: 14.7456Mhz

#include <iom128v.h>
#include <macros.h>

#include <math.h>

#define U8     unsigned char
#define U16    unsigned int
#define U32    unsigned long
#define I8     signed char
#define I16    signed int
#define I32    signed long
#define F32    float
//-----------------------------------------------------------------------------
//  变量
I16 SinTable[36]={0};                  //正弦表(用于小数乘法)
I16 CosTable[36]={0};                                   //余弦表(用于小数乘法)
I16 PWMTable[36]={0};                                 //PWM波形表
U16 FrqCnt=0;                                                             //分频计数
U16 PWMCnt=0;                                                            //PWM计数
U16 DFTCnt=0;                                                        //DFT计数
U16 TestPointCnt=0;                                      //测试点数计数
I32 au1=0,bu1=0,au2=0,bu2=0;                                 //测试矢量
U16 PointNum=36;                                                 //每周波点数
U16 WaveNum=32;                                                 //周波数
U16 TestNum=36*32;                                         //总测试点数


#define PointNum  36                 //PWM点数

//=============================================================================
//  端口初始化
//=============================================================================
void port_init(void)
{
PORTA = 0xFF;
DDRA  = 0x00;
PORTB = 0xFF;
DDRB  = 0x43;//CAN-RST/,SCK,CAN-CS  OUT
PORTC = 0xFF; //m103 output only
DDRC  = 0x00;
PORTD = 0xFF;
DDRD  = 0x00;
PORTE = 0xE4;
DDRE  = 0x10; //BIT4 :OC3B OUT 0, BIT2:CAN-INT/ IN 1,
PORTF = 0xFC;
DDRF  = 0x00; // ADC0,ADC1 IN 高阻态
PORTG = 0x18;
DDRG  = 0x18; // BIT4,BIT3:LED OUT 1,BIT2 ALE,BIT1 RD/,BIT0 WR/
}

//ADC initialisation
// Conversion time: 56uS
void adc_init(void)
{
ADCSRA = 0x00; //disable adc
ADMUX = 0xc0; //2.56V 片内基准电压,转换结果右对齐,精度10位,模拟通道0
ACSR  = 0x80;
ADCSRA = 0x81;//ADEN,ADSC=0,ADFR=0,ADIF=0,ADIE=0,CLOCK/2,停止连续转换       
}

//=============================================================================
//  定时器3初始化
//=============================================================================
//TIMER3 initialisation - prescale:8
// WGM: 10) PWM phz correct, TOP= ICRn ,OCRn更新时刻:bottom
// desired value: 23040Hz
// actual value: 23040.00Hz (0.0%)
void timer3_init(void)
{
TCCR3B = 0x00; //stop
TCNT3H = 0xFE; //setup
TCNT3L = 0xC0;
OCR3AH = 0x01;
OCR3AL = 0x40;
OCR3BH = 0x01;
OCR3BL = 0x40;
OCR3CH = 0x01;
OCR3CL = 0x40;
ICR3H  = 0x01;   //top=320
ICR3L  = 0x40;  //升序计数时,比较匹配清零,降序计数时置位OC3B
TCCR3A = 0x20;  // 1000相位、频率校正PWM, OC3B输出  预分频1
//TCCR3B = 0x11;
ETIMSK|= 0x04;        //使能T3溢出中断
}

#pragma interrupt_handler timer3_ovf_isr:30
void timer3_ovf_isr(void)//正弦波频率320Hz
{
unsigned long int j;
unsigned long int i;//TIMER3 has overflowed
static I16 AD0;
static I16 AD1;

if (++FrqCnt>=2)
   {
      FrqCnt=0;
          SEI();
      OCR3BH = PWMTable[PWMCnt]>>8;   //reload counter high value
      OCR3BL = PWMTable[PWMCnt];      //reload counter low value
    if (++PWMCnt>=PointNum)
       {PWMCnt=0;}
       if(ADCSRA&(1<<ADIF))
         {
         AD0=ADCL|(ADCH<<8);  //ADCH*256+ADCL, 取值
         }

     ADMUX=0xc1;      //2.56V 片内基准电压,转换结果右对齐,精度10位,模拟通道1
     ADCSRA|= (1<<ADEN); //ADEN,ADSC,-,-,-,CLOCK/64,单次转换         
     ADCSRA|= (1<<ADSC);
  
     if(ADCSRA&(1<<ADIF))
      {
       AD1=ADCL|(ADCH<<8);  //ADCH*256+ADCL, 取值
      }
      ADMUX =0xc0;
      ADCSRA|= (1<<ADEN);
      ADCSRA|= (1<<ADSC);
      }
      }
   
//call this routine to initialise all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
XDIV  = 0x00; //xtal divider
XMCRA = 0x00; //external memory
port_init();
adc_init();
timer3_init();

MCUCR = 0x00;
EICRA = 0x00; //extended ext ints
EICRB = 0x00; //extended ext ints
EIMSK = 0x00;
TIMSK = 0x00; //timer interrupt sources
ETIMSK = 0x04; //extended timer interrupt sources
SEI(); //re-enable interrupts
//all peripherals are now initialised
}

//============================================================================
//    延时子程序(毫秒)
//============================================================================
void delay_ms(unsigned int t)
{
   unsigned int i=0;
   for(i=0;i<t;i++){
      delay(982);
            WDR();
   }          
}
//============================================================================
//    延时子程序(微秒)
//============================================================================
void delay(unsigned int t)  
{  asm("push r24");
          asm("in r24,0x3f");
          asm("push r24");
          asm("push r25");
          asm("clr r24");
          asm("clr r25");
          asm("_loopu::nop");
          asm("nop");
          asm("nop");
          asm("nop");
          asm("nop");
          asm("nop");
          asm("nop");  
          asm("nop");
          asm("nop");
          asm("subi r24,-1");
          asm("sbci r25,-1");
          asm("cp  r24,%t");
          asm("cpc r25,r17");
          asm("brlo _loopu");
          asm("pop r25");
          asm("pop r24");
          asm("out 0x3f,r24");
          asm("pop r24");
}

void main(void)
{
  unsigned long int i;
  unsigned long int j;

   init_devices();
   timer3_init();

   ETIMSK|=0x04;
   ADCSRA|=(1<<ADIF);
   ADCSRA|=BIT(ADSC);   
   SEI();
   ADMUX =0xc0;
   ADCSRA|=BIT(ADSC);
   PORTG=0X00;

   while(1)
     {
       for (i=0;i<PointNum;i++)
        {
         PWMTable=160-90*sin(2*3.14159*i/PointNum);
              }
        TCCR3B = 0x11;
    }
}

出0入0汤圆

 楼主| 发表于 2008-2-13 15:49:15 | 显示全部楼层
一些小知识,供初学者参考:

位操作:
1   DDRB3=1     DDRB|=(1<<3)    DDRB|=BIT(3)   DDRB|=BIT(DDB3)  是等同的
2  PORTA&=0x7f;     PORTA&=0b0111 1111   

if ((PIND&0x80)==0)       if((PIND&(1<<7))==0)
if ((PIND&0x80)==0x80)    if((PIND&(1<<7))==(1<<7))


3  const int table[7]={1,2,3);//说明table 是按照表格样分配在程序存储器的数组的
const char *ptr1; //数据在数据存储器,而指向数据的指针在程序存储器。(地址ptr1在rom)
char * const ptr2;//数据在程序存储器,而指向数据的指针在数据存储器。
const char * const ptr3;//都在程序存储器。
const char hello[]="hello world";//为了节约空间,用常量字符形数组将字符串放在rom中。
unsigned char c =*(volatile unsigned char *)0x5f;//在数据内存中一个直接地址可以通过加指针类型符号直接访问。sreg的地址是5f,这样可以访问sreg。
*(volatile unsigned char *)0x5f|=0x80;  //同上  访问0x20--0x5f地址

4  EECR|=(1<<EEMWE);
while (EECR&(1<<EEWR))
WDTCR=(1<<WDCE)|(1<<WDE);        置位WDCE,WDE
PORTB=(1<<PB7)|(1<<PB5)|(1<<PB4)|(1<<PB2);
DDRB=(1<<DDB7)|(1<<DDB5)|(1<<DDB4)|(1<<DDB2);

PORTA|=BIT(PA7);   PORTA|=0X80;

PORTA^=0X80;//翻转位7

5  置位数据寄存器的第7位,
char a;
a|=(1<<7);
或者  a|=BIT(7);

6  在macros.h中。定义了常用的位操作宏定义。
#define WDR()   asm("wdr")
#define SEI()   asm("sei")
#define CLI()   asm("cli")
#define NOP()   asm("nop")
#define _WDR()   asm("wdr")
#define _SEI()   asm("sei")
#define _CLI()   asm("cli")
#define _NOP()   asm("nop")
6
#define pi 3.1415926
#define LEAP_YEAR year%4==0\
        & year%100!=0| year%400==0  //一行写不下用\
#define S(a,b)  a*b      // area=s(3,2)
#define S(r)  pi*(r)*(r)    //area=S(a+b);  =pi*(a+b)(a+b)
7

条件编译。
#ifdef  KEY
   .....;
#else  
   ....;
#endif


用0b<1|0>指定二进制。
#define U8     unsigned char
#define U16    unsigned int
#define U32    unsigned long
#define I8     signed char
#define I16    signed int
#define I32    signed long
#define F32    float

出0入0汤圆

 楼主| 发表于 2008-2-13 15:50:01 | 显示全部楼层
累了,休息会. 整理了在上传.

出0入21汤圆

发表于 2008-2-13 15:58:59 | 显示全部楼层
看看吧!

出0入0汤圆

发表于 2008-2-13 16:20:26 | 显示全部楼层
看到身边几个朋友也不做技术了,唉~~  自己还想玩到底 想想也挺难过的! 也许他们是对的.

出0入0汤圆

发表于 2008-2-13 16:54:39 | 显示全部楼层
好贴.. 我一直以为老月是学生呢

出0入0汤圆

发表于 2008-2-13 17:00:31 | 显示全部楼层
建议打个包一起传上来吧!

出0入0汤圆

发表于 2008-2-13 17:47:32 | 显示全部楼层
谢谢!!!

出0入0汤圆

发表于 2008-2-13 17:54:44 | 显示全部楼层
你不做开发,改做什么了?

出0入0汤圆

发表于 2008-2-13 18:04:02 | 显示全部楼层
改做月老.
下了做溫習,謝謝月老JJ

出0入0汤圆

发表于 2008-2-13 18:04:44 | 显示全部楼层
楼住是女的吧,不会吧

出0入0汤圆

发表于 2008-2-13 18:06:19 | 显示全部楼层
呵呵  好东西

出0入0汤圆

发表于 2008-2-13 21:38:33 | 显示全部楼层
基本是些基础问题

出0入0汤圆

 楼主| 发表于 2008-2-14 08:35:25 | 显示全部楼层
恩.都是些基础的问题.
可惜以前做的一些项目,还有上位机程序,不知道被我放哪个邮箱了. 弄的好复杂.

现在也做技术,但不做设计编程.

出0入0汤圆

 楼主| 发表于 2008-2-14 08:36:53 | 显示全部楼层
谢谢大家关注啊.哈哈.以后到大连来玩啊.大连人好啊!!

出0入0汤圆

发表于 2008-2-14 10:29:23 | 显示全部楼层
看看,谢谢共享

出0入0汤圆

发表于 2008-2-14 10:35:03 | 显示全部楼层
女孩高技术的不多,稀有会员,谢谢楼主!

出0入0汤圆

发表于 2008-2-14 11:41:09 | 显示全部楼层
好帖呀
多谢老月姐姐
还帮我解决了一个难题呢:就是按键实现开机和关机的问题,不知道老月姐姐还记得我不?哈哈

出0入0汤圆

发表于 2008-2-14 11:44:45 | 显示全部楼层
进来拜一下

出0入0汤圆

发表于 2008-2-14 11:52:47 | 显示全部楼层
谢谢共享!

出0入8汤圆

发表于 2008-2-14 12:25:22 | 显示全部楼层
老月不老啊!
真是女的吗?很漂亮喔

出0入0汤圆

发表于 2008-2-14 13:15:10 | 显示全部楼层
谢谢!!!

出0入0汤圆

发表于 2008-2-14 14:55:04 | 显示全部楼层
改行做什么?

出0入0汤圆

发表于 2008-2-14 15:13:03 | 显示全部楼层
很有用呀,谢谢分享

出0入0汤圆

发表于 2008-2-14 19:21:56 | 显示全部楼层
老月不老啊!
真是女的吗?很漂亮喔

看见是女的你就直眼了

出0入0汤圆

发表于 2008-2-15 09:29:54 | 显示全部楼层
喜欢楼主了,怎么办?

出0入0汤圆

 楼主| 发表于 2008-2-15 12:27:22 | 显示全部楼层
晕了.

出0入0汤圆

 楼主| 发表于 2008-2-15 12:28:43 | 显示全部楼层
谢谢大家了.

出0入0汤圆

发表于 2008-2-15 12:36:25 | 显示全部楼层
谢谢楼主的分享!!!

出0入0汤圆

发表于 2008-2-15 14:21:00 | 显示全部楼层
飘过

出0入0汤圆

发表于 2008-2-15 15:18:53 | 显示全部楼层
支持一下!

出0入0汤圆

发表于 2008-2-16 10:31:01 | 显示全部楼层
谢楼主共享

出0入0汤圆

发表于 2008-2-16 15:53:21 | 显示全部楼层
我也喜欢楼主了,怎么办?

出0入0汤圆

发表于 2008-2-16 16:26:28 | 显示全部楼层
一起去吧,哈哈!

出0入0汤圆

发表于 2008-2-17 00:07:06 | 显示全部楼层
学习了

出0入50汤圆

发表于 2008-2-17 09:18:09 | 显示全部楼层
5,6年去过大连,是在华南国际广场的那个沃尔玛开业的时候去的,大连给我印象最深的是:

上公交车都是自觉的排队的,就算是在郊区!所以虽然公司规定可以打车报销的,我还是坐了几次公交,呵呵,比上海好多了!!佩服!!

出0入0汤圆

发表于 2008-2-17 17:42:49 | 显示全部楼层
谢谢哦

出0入0汤圆

发表于 2008-2-17 20:07:34 | 显示全部楼层
我也喜欢楼主了,怎么办?

出0入0汤圆

发表于 2008-2-17 20:26:30 | 显示全部楼层
不做设计开发了?

我也希望不做技术开发了。
楼主谈谈转行做什么了???

出0入0汤圆

发表于 2008-2-17 21:01:24 | 显示全部楼层
做了管理啦?

出0入0汤圆

 楼主| 发表于 2008-2-18 08:27:53 | 显示全部楼层
做技术支持.大连人是好.呵呵.

公交车也文明.

出0入0汤圆

发表于 2008-2-18 09:11:56 | 显示全部楼层
谢谢啊,呵呵

出0入50汤圆

发表于 2008-2-18 09:13:08 | 显示全部楼层
想不通,实在想不通!!!!

我当年就是做技术支持,后来实在受不了,才转行搞研发的,技术支持不好做啊,我那个时候就是作为技术支持到大连沃尔玛出差的,做即使支持的,薪水不高,不过待遇还好,坐飞机住酒店,但是累啊,手机费用单位支付,我都不知道一个月用了多少,但是公司规定必须24小时开机,不做技术支持是不知道其中的苦,半夜鸡叫,你还必须得接!!!

所以发誓这辈子,下辈子,下下辈子都不做技术支持了!!!

出0入0汤圆

发表于 2008-2-18 11:26:46 | 显示全部楼层
刚下,进来顶下~

出0入0汤圆

发表于 2008-2-18 11:35:31 | 显示全部楼层
进来支持lz姐姐

出0入0汤圆

发表于 2008-2-18 17:04:59 | 显示全部楼层
支持!!

出0入0汤圆

发表于 2008-2-18 22:54:08 | 显示全部楼层
非常感谢!
同意51楼的,我也是做技术支持的,太累了。

出0入0汤圆

发表于 2008-2-19 00:25:53 | 显示全部楼层
我以为东北的汉子豪爽,原来东北的姐姐一样的爽!!
--------------------------------------------------谢谢分享!!

出0入0汤圆

发表于 2008-2-19 19:57:08 | 显示全部楼层
老月姐姐在大连```
真是巧了```我也在大连````刚好也是搞单片机应用开发的```在大连做软件的很多,做单片机和电子的很少```
不知道老月姐姐在那里工作```有时间向你学习学习```

出0入4汤圆

发表于 2008-2-20 09:31:14 | 显示全部楼层
老月姐姐人漂亮,资料也好。

出0入0汤圆

发表于 2008-2-20 13:24:33 | 显示全部楼层
我来顶一下,

出0入0汤圆

发表于 2008-2-20 13:42:10 | 显示全部楼层
楼主MM好漂亮啊,来杯儿一个..

出0入0汤圆

发表于 2008-2-20 15:21:07 | 显示全部楼层
谢谢了,都是好东西!!!

出0入0汤圆

 楼主| 发表于 2008-2-22 10:16:47 | 显示全部楼层
呵呵.居然有这么多人捧场.
真是谢谢大家了.

俺做技术支持可是轻松啊.

因为我们代理的是意大利的全自动木柴干燥控制仪.
   现在遇到淡季, 我也才来公司不久.所以出差还没有轮到我.即使出差了.东西也不会很难.

公司利润高, 待遇也还行.不高不低.
回楼上的某些同志:
俺是湖北人. 哈哈,不是大连人. 但是俺男朋友是大连的. 为了他,俺才到大连工作了.明年结婚.呵呵呵.

我们是女人.不像男儿志在四方.
呵呵.有个工作,一个疼自己的老公就好了

还有. 很荣幸,阿莫让我当了水坛的版主. 希望以后大家多多捧场.

出0入0汤圆

发表于 2008-2-22 13:43:41 | 显示全部楼层
恩,资料也好,人也好,我一起打包下载了。。。。

出0入0汤圆

发表于 2008-2-22 15:04:36 | 显示全部楼层
谢了!  祝福你!

出50入0汤圆

发表于 2008-2-22 16:03:43 | 显示全部楼层
好东西嘛!   谢谢 laoyue

出0入0汤圆

发表于 2008-2-22 16:45:47 | 显示全部楼层
谢谢老月啦 ~!

出0入0汤圆

发表于 2008-2-25 17:04:22 | 显示全部楼层
谢谢

出0入0汤圆

发表于 2008-3-15 16:57:37 | 显示全部楼层
谢谢

出0入0汤圆

发表于 2008-3-16 09:42:05 | 显示全部楼层
谢谢

出10入10汤圆

发表于 2008-3-16 10:47:30 | 显示全部楼层
好好学习

出0入0汤圆

发表于 2008-3-16 14:25:47 | 显示全部楼层
支持

出0入0汤圆

发表于 2008-3-16 20:54:06 | 显示全部楼层
好好学习!!!

出0入0汤圆

发表于 2008-3-16 22:45:45 | 显示全部楼层
姐姐你好漂亮哦
谢谢你了!!

出0入0汤圆

发表于 2008-3-17 09:48:42 | 显示全部楼层
我也来学习一下,谢谢啦

出0入0汤圆

发表于 2008-3-17 11:02:10 | 显示全部楼层
初玩AVR,收入了,谢谢美女贡献的资料!

出0入0汤圆

发表于 2008-3-17 11:20:39 | 显示全部楼层
学习

出0入0汤圆

发表于 2008-3-17 11:50:10 | 显示全部楼层
好累啊,终于看完了。非常感谢

出0入0汤圆

发表于 2008-3-19 11:34:40 | 显示全部楼层
顶一下

出0入0汤圆

发表于 2008-3-26 16:37:19 | 显示全部楼层
才看见 老月姐姐 的帖子

出0入0汤圆

发表于 2008-3-26 17:40:54 | 显示全部楼层
有谁打好包了?(*^__^*) 嘻嘻……
共享下~~~~

出0入0汤圆

发表于 2008-3-27 10:27:36 | 显示全部楼层
谢谢

出0入0汤圆

发表于 2008-3-27 15:59:42 | 显示全部楼层
做个记号呵呵~

出0入0汤圆

发表于 2008-3-27 19:32:26 | 显示全部楼层
我收藏到博客中了http://colinhouyuejun.blog.163.com
谢谢~~~

出0入0汤圆

发表于 2008-4-5 19:34:46 | 显示全部楼层
laoyue 你好厉害啊

出0入0汤圆

发表于 2008-4-5 23:39:38 | 显示全部楼层
记下

出0入0汤圆

发表于 2008-12-15 15:04:26 | 显示全部楼层
顶&nbsp;

使劲顶

出0入0汤圆

发表于 2008-12-15 15:32:19 | 显示全部楼层
mark

出0入0汤圆

发表于 2008-12-15 15:34:28 | 显示全部楼层
学习,顶

出0入0汤圆

发表于 2008-12-15 15:55:15 | 显示全部楼层
mark

谢谢

出0入0汤圆

发表于 2008-12-15 21:50:36 | 显示全部楼层
太好了&nbsp;,神仙又出现了

出0入0汤圆

发表于 2008-12-15 22:45:30 | 显示全部楼层
厉害看了。。满有收获的。。支持

出0入0汤圆

发表于 2008-12-15 23:38:48 | 显示全部楼层
支持

出0入0汤圆

发表于 2008-12-16 00:23:49 | 显示全部楼层
记号

出0入0汤圆

发表于 2008-12-16 03:43:42 | 显示全部楼层
呵呵,久仰楼主大名了,仔细把楼主帖的资料看了一遍,来在鸡蛋里挑个骨头:

10楼的如下两行刚好说反了:

const&nbsp;char&nbsp;*ptr1;&nbsp;//数据在数据存储器,而指向数据的指针在程序存储器。(地址ptr1在rom)&nbsp;

char&nbsp;*&nbsp;const&nbsp;ptr2;//数据在程序存储器,而指向数据的指针在数据存储器。&nbsp;



个人认为应该是:

const&nbsp;char&nbsp;*ptr1;&nbsp;//指针变量ptr1在RAM(数据存储器)中,而它所指向的数据在ROM(程序存储器)中。

char&nbsp;*&nbsp;const&nbsp;ptr2;//指针变量ptr2在ROM(程序存储器)中,而它所指向的数据在RAM(数据存储器)中。





没有跟楼主过不去的意思,只是搞技术就一定要严谨,我们这里一错不要紧,误导了别人可就不好了,上纲上线的说法叫“误人子弟”嘛:D

出0入0汤圆

发表于 2008-12-16 08:18:22 | 显示全部楼层
顶一下&nbsp;

出0入0汤圆

发表于 2008-12-16 08:37:29 | 显示全部楼层
mark

出0入0汤圆

发表于 2008-12-16 09:13:48 | 显示全部楼层
顶,好贴。

出0入0汤圆

发表于 2008-12-16 09:27:56 | 显示全部楼层
好难消化啊

出0入0汤圆

发表于 2008-12-16 10:41:21 | 显示全部楼层
太多了&nbsp;先记下
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-8 08:19

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表