鹰空独舞
迈着慵懒的步子,走在成长路上..... Dead
posts - 4,comments - 1,trackbacks - 0
     摘要: 在STM32的固件库和提供的例程中,到处都可以见到assert_param()的使用。如果打开任何一个例程中的stm32f10x_conf.h文件,就可以看到实际上assert_param是一个宏定义;  阅读全文
posted @ 2012-05-31 16:53 鹰空独舞 阅读(23857) | 评论 (1)编辑 收藏

OSTaskCreate()
函数原型:INT8U OSTaskCreate(void(*task)(void *pd),void *pdata,OS_STK *ptos,INT8U prio)
调用者:任务或者是初始化代码。
作用:建立一个新任务,任务的建立可以在多个任务环境启动之前,也可以在正在运行的任务中建立,中断处理程序中不能建立任务,一个任务必须为无限循环结构,且不能有返回点。无论用户程序中是否产生中断,在初始化任务堆栈时,堆栈的结构必须与处理器中断后寄存器入栈的顺序结构相同。

该函数返回一个8位的整形数,调用该函数需要四个参数:
a 第一个参数:task是一个指向任务代码的指针,也就是用户代码的首地址,平常使用中我们把自己创建的任务的名字作为这个参数即可。
b 第二个参数:pdata指向一个数据结构,该结构用来在建立任务时向任务传递参数。
c 第三个参数:ptos是指向任务堆栈栈顶的指针,一般把创建的任务的堆栈数组首地址赋给它。
任务堆栈用来保存局部变量,函数参数,返回地址以及任务被中断时处理器寄存器的内容,任务堆栈的大小决定于任务的需要以及预计的中断嵌套层数。计算堆栈的大小需要知道任务的局部变量所占的空间,可能产生嵌套调用的函数,及中断嵌套所需的空间,如果初始化常量OS_STK_GROWTH设为1,堆栈被设为从内存高地址向低地址增长,此时ptos应该指向任务堆栈空间的最高地址,反之,如果OS_STK_GROWTH设为0,堆栈将从内存的低地址向高地址增长。
d 第四个参数:prio是任务的优先级。每个任务必须有一个唯一的优先级作为标识,数字越小,优先级越高。

返回值:
OSTaskCreate()的返回值为下述之一:
# OS_NO_ERR: 函数调用成功。
# OS_PRIO_EXIST:具有该优先级的任务已经存在。
# OS_PRIO_INVALID: 参数指定的优先级大于OS_LOWEST_PRIO
# OS_NO_MORE_TCB: 系统中没有OS_TCB可以分配给任务了。

注意:
1 任何堆栈必须声明为OS_STK类型。
2 在任务中必须调用uCOS提供的下述过程之一:延时等待,任务挂起,等待事件发生(等待信号量,消息邮箱,消息队列),以便其他任务能得到cpu。
3 程序中不能使用优先级0,1,2,3,以及OS_LOWEST_PRIO-3,OS_LOWEST_PRIO-2,OS_LOWEST_PRIO-1,

OS_LOWEST_PRIO,这些优先级系统保留,其余的56个优先级提供给应用程序。

范例:
本例中,传递给任务Task1()的参数pdata不使用,所以指针pdata被设为NULLL,注意到程序中设定堆栈向低地址增长,传递的栈顶指针为高地址&Task1[1023],如果在你的程序中设定堆栈向高地址增长,则传递的栈顶指针应该为&Task1Stk[0]。
OS_STK Task1Stk[1024];
void main(void)
{
NT8U err;
   ...
OSInit();//初始化uCOS-II
....
OSTaskCreate(Task1,(void *)0,&Task1Stk[1023],25);
...
OSStart();//启动多任务环境
}

void Task1(void *pdata)
{
pdata=pdata;
for(;;)
{
......   //任务代码
}

}

posted @ 2012-05-31 16:23 鹰空独舞 阅读(463) | 评论 (0)编辑 收藏
NAND FLASH  与NOR FLASH 的区别

与Nand Flash对应的是另一种Flash:Nor Flash,其对应的特点是:
“NorFlash的特点是芯片内执行(XIP,eXecute In Place),这样应用程序可以直接在flash闪存内运行,不必再把代码读到系统RAM中。如uboot中的ro段可以直接在NorFlash上运行,只需要把rw和zi段拷贝到RAM中运行即可。 ”

而相应地,Nand Flash比较特殊:
“NandFlash器件使用复杂的I/O口来串行地存取数据,8个引脚用来传送控制、地址和数据信息。由于时序较为复杂,所以一般CPU最好集成NAND控制器。另外由于NandFlash没有挂接在地址总线上,所以如果想用NandFlash作为系统的启动盘,就需要CPU具备特殊的功能,如s3c2410在被选择为NandFlash启动方式时会在上电时自动读取NandFlash的4k数据到地址0的SRAM中。如果CPU不具备这种特殊功能,用户不能直接运行NandFlash上的代码,那可以采取其他方式,比如好多使用NandFlash的开发板除了使用NandFlash以外,还用上了一块小的NorFlash来运行启动代码。”

至于,为什么Nand Flash不能进行XIP的原因,主要是由于物理上的硬件限制,
在读取Flash时候,容易出现“位翻转(bit convert)”:
“在Flash的位翻转(一个bit位发生翻转)现象上,NAND的出现几率要比NorFlash大得多。这个问题在Flash存储关键文件时是致命的,所以在使用NandFlash时建议同时使用EDC/ECC等校验算法。 ”

但是,如果能保证不出错,也还是可以进行XIP,可以在其上执行代码的:
“所谓XIP,就是CODE是在FLASH上直接运行. NANDFLASH只是不适合做XIP,但并不是不能做XIP.
要一段CODE能够正确的运行,要保证它的CODE是连续的,正确的.
由于一些电气特性的原因,NOR FLASH能够做到这一点,不存在坏道或坏块,所以能够做XIP.
而对于NAND FLASH, 它只保证它的BLOCK 0是好的,其他的块并不保证,虽然出错的几率比较低,但还是有出错的可能,所以CODE可能无法连续正确地执行.
但只要你有额外的保障措施,比如说在执行CODE之前去做一次ECC校验,来确保CODE是连续正确的.那你也可以做XIP. 事实上我就正在这么做,而且也证明是成功的. ”

posted @ 2012-05-29 16:46 鹰空独舞 阅读(375) | 评论 (0)编辑 收藏
再做课程设计时遇到的问题,及相应解决办法
1.添加背景音乐(设计的界面太单调,以前只是知道一些基本语法,现想提升一下自己)
主要代码如下:
import java.io.*; 
import java.awt.*;
import java.net.MalformedURLException; public static void main(String args[]) { 
try {
URL cb;
File f = new File("C:\\Documents and Settings\\Administrator\\桌面\\刀出鞘.wav"); //引号里面的是音乐文件所在的绝对路径
cb = f.toURL();
AudioClip aau;
aau = Applet.newAudioClip(cb);
//aau.play();
aau.loop();
//循环播放 aau.play() 单曲 aau.stop()停止播放
}
 catch (MalformedURLException e){
    e.printStackTrace();
   } 
}

2.添加背景图片
主要代码:
import java.swing.*;
final ImageIcon img=new ImageIcon("jiemian.jpg"); 
    JPanel jpnl =new JPanel(){  
       public void paintComponent(Graphics g){  
         g.drawImage(img.getImage(),0,0,580,500,null,null);  
         super.paintComponent(g);} };
       jpnl.setBounds(0,0,587,540);
       jpnl.setOpaque(false);  
3.键盘输入识别
识别'Enter'键,主要代码:
 public void keyPressed(KeyEvent ke){
  if(ke.getKeyChar() == ke.VK_ENTER){  //以前不知道,原来有一个系统中有专门的常量对应键盘特殊按钮
   System.out.println ("ok................") ;
  }
 }
4.按钮数组及其响应 (刚开始时把它想复杂了)
主要代码:
JButton btn[]=new JButton[5];
.......
void  define(){
    btn[0]=new JButton("btn1");
    btn[1]=new JButton("btn2");
    btn[2]=new JButton("btn3");
    btn[3]=new JButton("<html>按钮四<br>和 按钮五</html>");   //<html>......<br>可以实现按钮上字符串换行显示的功能
    btn[4]=new JButton("btn6");
    for(int i=0;i<5;i++)
    {
      btn[i].addActionListener(new ActListen());
    }
}
 class ActListen implements ActionListener
 {
   public void actionPerformed(ActionEvent e)
 {
  JButton butn=(JButton)e.getSource();
  if(butn==btn[1]){            
    }        
  else if(butn==btn[2]){       
  }
  else if(butn==btn[0]){   
   }
   else if(butn==btn[3]){   
   }
  else if(butn==btn[4]){
   }
}
.........
posted @ 2011-01-16 00:18 鹰空独舞 阅读(279) | 评论 (0)编辑 收藏