启动ucosii之六PC_VectSet(0x08,OSTickISR)

第十章 μC/OS-Ⅱ在80x86上的移植 第十章 μC/OS-Ⅱ在80x86上的移植 10.1 概述 在应用程序主函数中,除了OSInit()之外,还要使用: PC_VectSet(uCOS, OSCtxSw);  //安装μC/OS-Ⅱ中断向量 在起始任务的代码中,使用: PC_VectSet(0x80, OSTickISR);  //安装μC/OS-Ⅱ系统时钟中断向量 PC_SetTickRate(OS_TICKS_PER 阅读详情

原型来自PC.C
void PC_VectSet (INT8U vect, void (*isr)(void))
{
#if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
    OS_CPU_SR  cpu_sr;
#endif   
    INT16U    *pvect;
       
    pvect    = (INT16U *)MK_FP(0x0000, vect * 4);     /* Point into IVT at desired vector location     */
    OS_ENTER_CRITICAL();
/*
函数名: FP_OFF
功  能: 获取远地址偏移量
用  法: unsigned FP_OFF(void far *farptr);
函数位置: dos.h
*/
    *pvect++ = (INT16U)FP_OFF(isr);                   /* Store ISR offset                              */
/*
函数名: FP_SEG
功  能: 获取远地址段值
用  法: unsigned FP_SEG(void far *farptr);
函数位置: dos.h
*/
    *pvect   = (INT16U)FP_SEG(isr);                   /* Store ISR segment                             */
    OS_EXIT_CRITICAL();
}

奋斗
uCOS-II必须在多任务系统启动之后,也就是在调用OSStart()之后,再开启时钟节拍器.换句话说,调用OSStart()之后应做的第一件事是初始化定时器中断.
uCOS-II中,时钟节拍中断是一个非常重要的中断,因为整个操作系统的活动都受到它的激励.系统利用时钟中断来维持任务的延时、等待以及切换等操作,以保证多有任务都能平等的得到cpu的拥有权.可以说,它是整个OS的脉搏.

时钟节拍的任务切换是中断级的任务切换,中断程序中调用的切换函数OSIntCtxSw()

PC_VectSet(0x08,OSTickISR)
时钟节拍函数OSTickISR,时钟中断服务程序,原型OS_CPU_A.ASM

_OSTickISR  PROC   FAR
;
;将通用寄存器的内容压入堆栈.
;这些寄存器按以下顺序存储到堆栈:EAX、ECX、EDX、EBX、ESP、EBP、ESI 及 EDI
;注意:按照依次压栈顺序,当执行PUSH SP时,把此时堆栈指针SP的位置记录下来,堆栈中记录的是SP_BX(此时SP指向BX存储单元)
;保护上下文环境
            PUSHA                                ; Save interrupted task's context
            PUSH   ES
            PUSH   DS
;
;uCOS-II.H中定义的OS_EXT  INT8U  OSIntNesting; /* Interrupt nesting level中断嵌套级别 */
;SEG-汇编程序将回送变量或标号的段地址值.获取记录中断嵌套层数
            MOV    AX, SEG(_OSIntNesting)        ; Reload DS
            MOV    DS, AX
;uC/OS-II要求在中断服务程序开头调用OSIntEnter(),其作用是将记录中断嵌套层数的全局变量OSIntNesting加1.如果不调用OSIntEnter(),直接将OSIntNesting加1也是允许的
            INC    BYTE PTR DS:_OSIntNesting     ; Notify uC/OS-II of ISR
;
            CMP    BYTE PTR DS:_OSIntNesting, 1  ; if (OSIntNesting == 1)

;DS:_OSIntNesting不为1,不可以调度,短转移至_OSTickISR1
            JNE    SHORT _OSTickISR1

;DS:_OSIntNesting为1,说明可以调度
;载入当前任务控制块            
            MOV    AX, SEG(_OSTCBCur)            ;     Reload DS
            MOV    DS, AX

;将任务的私栈的堆栈指针从任务的任务控制块OS_TCB的在成员OSTCBStkPtr中取出来
;LES指令的功能是:把内存中指定位置的双字操作数的低位字装入指令中指定的寄存器、高位字装入ES寄存器
            LES    BX, DWORD PTR DS:_OSTCBCur    ;     OSTCBCur->OSTCBStkPtr = SS:SP
            MOV    ES:[BX+2], SS                 ;
            MOV    ES:[BX+0], SP                 ;
;
_OSTickISR1:
;OSTickDOSCtr:OS_CPU.H中定义的全局变量,为调用DOS时钟中断而定义的计数器
;8位变量OSTickDOSCtr,将保存时钟节拍发生的次数,每发生11次,调用DOS的时钟节拍函数一次,从而实现与DOS时钟的同步.
;OSTickDOSCtr是专门为PC环境而声明的,如果在其他非PC的系统中运行uC/OS-II,就不用这种同步方法,直接设定时钟节拍发生频率就行了
;计数器OSTickDOSCtr减1,每发生11次中断,OSTickDOSCtr减到0,则调用DOS的时钟中断处理函数,调用间隔大约是54.93ms.
;如果不调用DOS时钟中断函数,则向中断优先级控制器(PIC)发送命令清除中断标志.如果调用了DOS中断,则此项操作可免,因为在DOS的中断程序中已经完成了
            MOV    AX, SEG(_OSTickDOSCtr)        ; Reload DS
            MOV    DS, AX
            DEC    BYTE PTR DS:_OSTickDOSCtr
            CMP    BYTE PTR DS:_OSTickDOSCtr, 0

;
;OSTickDOSCtr不为0,说明还没有发生11次中断,转移;否则调用DOS的时钟中断处理函数
            JNE    SHORT _OSTickISR2             ; Every 11 ticks (~199.99 Hz), chain into DOS
;
;
            MOV    BYTE PTR DS:_OSTickDOSCtr, 11  ;赋值OSTickDOSCtr=11,重新开始自减过程
;调用软中断81H.即DOS中断处理函数
            INT    081H                          ; Chain into DOS's tick ISR
            JMP    SHORT _OSTickISR3

_OSTickISR2:
;数据输入输出时的地址要放在DX中,数据以AX作传输媒介
;eg   IN AL,21H 表示从21H端口读一个字节数据到AL.
;将AL持有的数据写入20H端口
;当每一次中断处理结束,需要发送一个EOI给8259A,以便继续接收中断
;发送EOI是通过往端口20H或A0H写OCW2来实现的
            MOV    AL, 20H                       ; Move EOI code into AL.
            MOV    DX, 20H                       ; Address of 8259 PIC in DX.
            OUT    DX, AL                        ; Send EOI to PIC if not processing DOS timer.
;
_OSTickISR3:
;调用内核OS_CORE.C函数void  OSTimeTick (void)
            CALL   FAR PTR _OSTimeTick           ; Process system tick
;
;
;
;调用内核OS_CORE.C函数void  OSIntExit (void)
;在uC/OS-II中,由于中断的产生可能会引起任务切换,在中断服务程序的最后会调用OSIntExit()函数检查任务就绪状态,如果需要进行任务切换,将调用OSIntCtxSw().
;所以OSIntCtxSw()又称为中断级的任务切换函数.由于在调用OSIntCtxSw()之前已经发生了中断,OSIntCtxSw()将默认CPU寄存器已经保存在被中断任务的堆栈中了.
            CALL   FAR PTR _OSIntExit            ; Notify uC/OS-II of end of ISR
;
;依次执行POP DS/POP ES/POPA,从任务A的私栈中恢复相关寄存器的内容到CPU的相关寄存器中
            POP    DS                            ; Restore interrupted task's context
            POP    ES
;依次弹出 edi, esi, ebp, esp, ebx, edx, ecx, eax
            POPA
;
;执行IRET中断返回指令
            IRET                                 ; Return to interrupted task
;
_OSTickISR  ENDP
;
            END

奋斗

函数原型来自OS_CORE.C
//uC/OS-II有两种任务调度器:任务级的调度器和中断级的调度器.
//任务级的调度器由函数OSSched()来实现;中断级的调度器由函数OSIntExit()来实现
void  OSIntExit (void)//关中断
{
#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
    OS_CPU_SR  cpu_sr;//有些编译器可以得到处理器的状态字,OS_CPU_SR 这个宏就会在os_cpu.h中定义
#endif
   
//处理器只有在开放中断期间才能响应中断请求,而在其他时间是不能响应中断请求的.因为在应用程序中经常有一些代码段必须不受任何干扰地连续运行,这样的代码段称为临界段.
//因此为了使临界段在运行时不受中断所打断,在临界段代码前必须使处理器屏蔽中断请求,而在临界段代码后重新接触屏蔽,使处理器可以响应中断请求.
//uC/OS-II中用OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()这两个宏来实现中断的开放和关闭.而把与系统硬件相关的关中断和开中断的指令分别封装在这两个宏中.   
    if (OSRunning == TRUE) {//判断操作系统是否已经启动
        OS_ENTER_CRITICAL();//代码临界段,不允许中断
        if (OSIntNesting > 0) { /* Prevent OSIntNesting from wrapping */
            OSIntNesting--;
        }
//在中断服务程序中不允许进行任务调度,所以每当进入中断服务程序就要把变量OSIntNesting加1,而当中断返回前则要把OSIntNesting减1.
//这样调度器就不会在中断服务程序中进行调度工作了
//需要注意的是OSIntNesting是一个记录中断嵌套层数的计数器变量,所以只有当其值为0的时候才允许调度.
//因此,尽管在嵌套中断中每个中断服务程序都调用了中断退出函数OSIntExit(),但并非每个嵌套中断结束前都会发生调度,而只有当变量OSIntNesting为0时才会发生调度
 //没有其它中断且任务调度没有锁定→中断退出进行任务调度的条件
        if ((OSIntNesting == 0) && (OSLockNesting == 0)) { /* Reschedule only if all ISRs complete ... */
          /* ... and not locked.                      */
     //获取最高优先级别的任务在任务就绪
     //表中的纵向位置 Y
            OSIntExitY    = OSUnMapTbl[OSRdyGrp];
     //获取最高优先级别的任务的优先级别        
            OSPrioHighRdy = (INT8U)((OSIntExitY << 3) + OSUnMapTbl[OSRdyTbl[OSIntExitY]]);
    //如果当前就绪任务中最高优先级别不等于当前中断的任务优先级则任务切换
            if (OSPrioHighRdy != OSPrioCur) {              /* No Ctx Sw if current task is highest rdy */
  //获取最高优先级别的任务控制块指针
                OSTCBHighRdy  = OSTCBPrioTbl[OSPrioHighRdy];
  //任务调度切换次数计数
                OSCtxSwCtr++;                              /* Keep track of the number of ctx switches */
  //进行中断级任务调度切换
//任务级调度器获得了最高级就绪任务的任务控制块指针之后,任务切换的工作是由宏OSCtxSw()来执行.(OSCtxSw()在文件OS_CPU_A.ASM中,由汇编编写).
//中断级的调度器任务切换工作是由OSIntCtxSw()来完成的,通常也是用汇编语言来完成的(在文件OS_CPU_A.ASM中)
                OSIntCtxSw();                              /* Perform interrupt level ctx switch       */
            }
        }
        OS_EXIT_CRITICAL();//打开中断
    }
}

奋斗

//时钟节拍
//目的是在时钟节拍到来时,检查每个任务的任务控制块中的.OSTCBDly-1后是否为0,如果是,那么表明这个任务刚才是挂起的状态,此时应改变为就绪态

void  OSTimeTick (void)
{
#if OS_CRITICAL_METHOD == 3                                /* Allocate storage for CPU status register */
    OS_CPU_SR  cpu_sr;
#endif   
    OS_TCB    *ptcb;

    OSTimeTickHook();                                      /* Call user definable hook                 */
#if OS_TIME_GET_SET_EN > 0  
    OS_ENTER_CRITICAL();                                   /* Update the 32-bit tick counter           */
    OSTime++;
    OS_EXIT_CRITICAL();
#endif
    if (OSRunning == TRUE) {   
        ptcb = OSTCBList;//时钟节拍到来时,传递控制块双向链表的指针

//空闲任务处于控制块双向链表的最后一个,如果取出的控制块为空闲任务的控制块,那么已经取到最后一个了,就结束                                  /* Point at first TCB in TCB list           */
        while (ptcb->OSTCBPrio != OS_IDLE_PRIO) {          /* Go through all TCBs in TCB list          */
            OS_ENTER_CRITICAL();
            if (ptcb->OSTCBDly != 0) {                     /* Delayed or waiting for event with TO     */
                if (--ptcb->OSTCBDly == 0) {               /* Decrement nbr of ticks to end of delay   */
      //检查任务是否处于强制挂起状态,如果是,那再挂起一个时钟节拍,否则就将它就绪
                    if ((ptcb->OSTCBStat & OS_STAT_SUSPEND) == OS_STAT_RDY) { /* Is task suspended?    */

                        OSRdyGrp               |= ptcb->OSTCBBitY; /* No,  Make task R-to-R (timed out)*/
                        OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
                    } else {                               /* Yes, Leave 1 tick to prevent ...         */
                        ptcb->OSTCBDly = 1;                /* ... loosing the task when the ...        */
                    }                                      /* ... suspension is removed.               */
                }
            }
            ptcb = ptcb->OSTCBNext;                        /* Point at next TCB in TCB list            */
            OS_EXIT_CRITICAL();
        }
    }
}

奋斗
;中断级的调度器任务切换
;在uC/OS-II中,由于中断的产生可能会引起任务切换,在中断服务程序的最后会调用OSIntExit()函数检查任务就绪状态,如果需要进行任务切换,将调用OSIntCtxSw().所以OSIntCtxSw()又称为中断级的任务切换函数.由于在调用OSIntCtxSw()之前已经发生了中断,OSIntCtxSw()将默认CPU寄存器已经保存在被中断任务的堆栈中了.

代码大部分与OSCtxSw()的代码相同,不同之处是,第一由于中断已经发生,此处不需要再保存CPU寄存器(没有PUSHA, PUSH ES, 或PUSH DS);第二OSIntCtxSw()需要调整堆栈指针,去掉堆栈中一些不需要的内容,以使堆栈中只包含任务的运行环境

;如果确实要进行任务切换,指针OSTCBHighRdy将指向新的就绪任务的OS_TCB
_OSIntCtxSw PROC   FAR
;
            CALL   FAR PTR _OSTaskSwHook           ; Call user defined task switch hook
;
            MOV    AX, SEG _OSTCBCur               ; Reload DS in case it was altered
            MOV    DS, AX                          ;
;
            MOV    AX, WORD PTR DS:_OSTCBHighRdy+2 ; OSTCBCur = OSTCBHighRdy
            MOV    DX, WORD PTR DS:_OSTCBHighRdy   ;
            MOV    WORD PTR DS:_OSTCBCur+2, AX     ;
            MOV    WORD PTR DS:_OSTCBCur, DX       ;
;
            MOV    AL, BYTE PTR DS:_OSPrioHighRdy  ; OSPrioCur = OSPrioHighRdy
            MOV    BYTE PTR DS:_OSPrioCur, AL
;
            LES    BX, DWORD PTR DS:_OSTCBHighRdy  ; SS:SP = OSTCBHighRdy->OSTCBStkPtr
            MOV    SS, ES:[BX+2]                   ;
            MOV    SP, ES:[BX]                     ;
;
            POP    DS                              ; Load new task's context
            POP    ES                              ;
            POPA                                   ;
;
            IRET                                   ; Return to new task
;
_OSIntCtxSw ENDP

嵌入式开发实战:如何用cJSON库在STM32上实现轻量级JSON通信(附完整代码) 本文详细介绍了如何在STM32嵌入式系统中使用cJSON库实现高效的JSON通信方案。针对嵌入式环境的内存限制,提供了内存优化策略、cJSON库的深度定制方法以及完整的通信流程实现代码,帮助开发者解决JSON解析效率低下和跨平台兼容性等核心挑战。 阅读详情

相关推荐

【2025年五一数学建模竞赛】A题 完整论文 模型建立与求解

2025年五一数学建模竞赛 A题:基于历史数据与模式识别的道路车流量推测模型研究

Magnolia_He的博客 3783

【UCOSii源码解读】UCOSii启动流程以及平台相关文件分析

文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结 前言 其实在一年多以前我就已经萌生了去写一下UCOSii的源码解析的想法,但是无奈当时水平有限,就算写了恐怕也只是表面上API的应用而已,这一次我向写一些对于UCOS更深层次的理解。其实在我看来所有的RTOS都具有十分类似的框架结构,只是其中填入的算法不同而已。其中最为核心的也就是一个优先级算法,以及调度算法。 一、pandas是什么? 示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。 二.

yy197696的博客 1955

手把手教你用EGM96模型校正DEM数据(含在线工具推荐)

本文详细介绍了如何使用EGM96地球重力场模型校正DEM数据中的高程偏差。通过对比WGS84椭球面与大地水准面的差异,解释了校正原理,并提供了从在线工具快速验证到Python脚本批量处理的全流程实战指南,帮助GIS开发者和数据分析师确保高程数据基准一致,提升空间分析精度。

ttt77的博客 1007

启动ucosii之三PC_VectSet(uCOS,OSCtxSw)

原型来自PC.C PC_VectSet(uCOS,OSCtxSw); //vect向量号,一个内部中断(软中断)向量号 //参数2-中断处理函数.即中断号为0x80的中断处理函数 void PC_VectSet (INT8U vect, void (*isr)(void)) { #if OS_CRITICAL_METHOD == 3                      /* Al

aimarpp的专栏 4287

MobaXterm详细使用教程

当然MobaXterm的功能远不止这些,但这些是最基本,最常用的,因此先拿出来讲。点击确定后,输入密码(输入密码时并不会显示,只管输入后按确定即可,第一次登陆成功后会提示保存密码,一般选择同意),就可以连接上虚拟机了。(2) 我们可以直接apt-get安装vim等常用功能(或者官网下载插件),实现在windows下模拟linux环境,这样就可以使用vi命令准备INCAR文件,也可以使用Gnuplot进行绘图。支持 Unix 命令(bash,ls,cat,sed,grep,awk,rsync,…

博客 4万+

基于Ollama本地大模型的Python自动化翻译工具开发实践

本文详细介绍了如何利用Ollama本地大模型和Python开发自动化批量翻译工具。通过部署本地开源模型、设计精准提示词、处理长文本分割及多种文档格式,构建了一个兼顾隐私安全、可控性与成本效益的翻译流水线,有效解决了文档批量翻译的痛点。

yhn45678901的博客 560

UC/OS -II 移植对比

 转载于:httpzq2007.blog.hexun.com9534277_d.html UC/OS-II的移植步骤分析                                              zqcumt    07-4-15关于UC/OS-II的移植网上介绍的已经很多了,比较流行的几款处理器(例如ARM)在网上都可以

i always go 758

Qt/C++ 音视频开发 - FFmpeg 安卓版

通过将 FFmpeg 集成到 Qt/C++ 项目中,我们可以实现强大且灵活的音视频处理功能。本文介绍了在安卓平台上使用 FFmpeg 的基本步骤,包括初始化、解码、处理和编码等。实际应用代码示例展示了如何在安卓设备上播放视频。

走向CTO的路上... 1190

UCOSII中的OSInter()是干嘛的?

今天发现自己的程序里本来想用临界代码段保护的,本来是这一对 1 { 2 ... 3 OS_ENTER_CRITICAL();, 4 .... 5 OS_EXIT_CRITICAL(); 6 } 但是发现由于当时疏忽写成了OSIntEnter();和OSIntExit();这一对函数和上面完全不是一个概念,这对是在进入中断服务函数...

dijianfei2190的博客 601

6、哈代空间、算子函数及相关概念解析

本文深入探讨了数学中哈代空间与算子函数的核心概念,包括强函数的因式分解、半单零点的定义与性质、Blaschke-Potapov乘积的存在性、Nagy-Foias模型算子的结构与谱分析、可数集合的相关性质(如Carlesonian集合、稀有集合等)、简单分式族的可分性与基性质,以及指数型整函数的增长特性。文章还分析了这些数学对象之间的内在联系,并通过图表与表格形式直观呈现了集合性质与函数空间结构的关系。这些理论不仅在数学分析和泛函分析中具有重要意义,也在信号处理、量子力学等应用领域具有广泛价值。

yhn4567890的博客 169

电压跟随器在ADC采样电路中的作用分析

电压跟随器在ADC采集系统中扮演关键角色,它能解决分压电路因ADC输入阻抗导致的电压误差问题。通过运放构成的电压跟随器可隔离信号源与负载,保证采样精度,尤其适用于高阻抗传感器或高速采样场景。工程应用中需注意运放带宽、轨对轨输出能力及抗干扰设计。合理使用电压跟随器能显著提升信号完整性,在复杂电子系统中成为不可或缺的"信号桥梁。

硬核科技 654

OSTickISR()

在9.03.05节中,我们已经提到过实时系统中时钟节拍发生频率的问题,应该在10到100Hz之间。但由于PC环境的特殊性,时钟节拍由硬件产生,间隔54.93ms (18.20648Hz)。我们将时钟节拍频率设为200Hz。PC时钟节拍的中断向量为0x08,µC/OS-II将此向量截取,指向了µC/OS的中断服务函数OSTickISR(),而原先的中断向量保存在中断129(0x81)中。为满足DOS

FunkyFrog821951259的博客 2308

深度解析:企业AI效能度量框架的核心指标与落地路径,收藏级干货

资源成本:GPU利用率从31%提升到75%,云费用减少了50万元/年;工程效率:模型迭代周期从2周缩短到3天,部署成功率从70%提升到95%;模型性能:CTR从8%提升到12%,CVR从3%提升到4.5%;业务价值:增量收入达200万元/月,ROI达180%;伦理风险:推荐结果的差异影响比从0.7提升到0.9,用户投诉率下降了30%。现在,当CEO再问「AI项目值多少钱?

AI天才研究院 1807

[UC/OS-II原理及应用]μC/OS-Ⅱ在80x86上的移植

10.1 概述 在应用程序主函数中,除了OSInit()之外,还要使用: PC_VectSet(uCOS, OSCtxSw); //安装μC/OS-Ⅱ中断向量 在起始任务的代码中,使用: PC_VectSet(0x80, OSTickISR); //安装μC/OS-Ⅱ系统时钟中断向量 PC_SetTickRate(OS_TICKS_PER_SEC); //设置μC/OS-Ⅱ系统时钟周期

三月,有人呼唤你的名字 1415

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

汇编学习历程(按键中断劫持)

assume cs:code,ds:data,ss:stack code segment start: mov ax,data mov ds,ax mov ax,stack mov ss,ax mov sp,16 ;set about segment mov ax,0 mov es,ax mov ax,word ptr es:[36] mov ds

如风一样的云 743

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

线程的应用

线程的应用 在java中,我们应该如何使用多线程。 继承Thread,通过start方法启动一个线程 实现Runnable接口,将实现类塞进Thread构造方法中,通过start方法启动。 使用ExecutorService、Callable、Future来实现带有返回结果的线程。 继承Thread类创建线程 public class ThreadDemo extends Thread{ ...

CandyCCCation的博客 305

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

启动ucosii之二PC_DOSSaveReturn()

以下函数原型来自PC.C void PC_DOSSaveReturn (void) { #if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */     OS_CPU_SR  cpu_sr;//OS_CPU.H typedef uns

aimarpp的专栏 2299

ucosii关于PC的中断基础知识

aimarpp的专栏 1421

可重入函数

可重入函数 什么是可重入函数?C语言如何写可重入函数? 可重入函数是指能够被多个线程“同时”调用的函数,并且能保证函数结果正确的函数。 在C语言中编写可重入函数时,尽量不要使用全局变量或静态变量,如果使用了全局变量或静态变量,就需要特别注意对这类变量的访问的互斥。一般采用以下几种措施来保证函数的可重入性:信号量机制,关调度机制,关中断机制。 需要注意的是,不要调用不可重入函数,当调用了不可重入函数时,会使该函数也变为不可重入函数。一般驱动程序都是不可重入函数,因此在编写驱动程序时一定要注意重入问题。

三月,有人呼唤你的名字 533

uC/OS-II学习笔记(1)

by WC 7.9.2015 本文假设读者对uC/OS-II和多任务知之甚少,但有一定的C语言和单片机基础。为的是为了从0开始学习uC/OS-II。流程图如下图示: 1## 范例1 ## 范例一演示uC/OC-II的多任务处理能力。共有10个任务在屏幕上面随机的位置显示一个0~9的数字。每个任务只显示同一个数字。其包含了13个任务,在运行窗口的左下角增加了两个内部任务。

Virgo的博客 1337

UCOSII 信号量和信号量集实例

代码来自于书本光盘 《嵌入式操作系统UCOSII原理及应用》 实例1信号量 #include "includes.h" #define  TASK_STK_SIZE   512 //任务堆栈长度 OS_STK   StartTaskStk[TASK_STK_SIZE]; //定义任务堆栈区 OS_STK MyTaskStk[TASK_STK_SIZE]; OS_ST

专注的力量 8901

中断机制

2.1 分析前得实现说明 操作系统是一个整体机制,事实上不能隔离任何一个机制,也就是说任何一个机 制是不可能脱离其他机制而单独存在,我们将这种机制类比一个图结构,设想一 下,如果有一个数学意义上的图 G,,G={G1,G2 …},这只是数学家给其定义的方 式,但是 G1,G2,….他们之间是不很难发生直接的联系,也就是说他是各自独 立而存在,但是 G1 内的各个节点都会有着直接或者间...

weixin_30608131的博客 327

uC/OS-II源码分析(1)

一、uC/OS-II的简介 uC/OS是一个微型的实时操作系统,包括了一个操作系统最基本的一些特性,如任务调度、任务通信、内存管理、中断管理等,而且这是一个代码完全开放的实时操作系统,简单明了的结构和严谨的代码风格,非常适合初涉嵌入式操作系统的人士学习,它可以让我们以最快的速度来了解操作系统的概念、结构和模块工作原理,并由浅入深逐步推广到商用操作系统上。同时对于那些对操作系统感兴趣的爱好

liyaoyao_yy的专栏 1048

使用jpa时,调用saveAll()方法报More than one row with the given identifier was found

业务场景: 采集服务持续采集数据并放入容器中,每当容器的数量大于1000时,会将容器内的数据放入缓存容器,并清空容器,执行一次保存缓存容器的操作,保存结束后清空缓存数据。 报错场景: 在保存这1000条缓存容器的数据时候偶尔会报More than one row with the given identifier was found...的错误 一般情况这个错误:More than one...

haohao_ding的博客 3384

怎么正确处理InterruptedException

在多核的时代,我们开始编写并发程序,于是碰到了InterruptedException,SUN的java文档告诉我们,当一个线程在sleep(),wait()或者join()的时候,如果被其他线程中断(通过thread.interrupt()方法),线程内部都会抛出这个InterruptedException异常。 在知道了来龙去脉后,我们开始处理InterruptedException异常,于...

Coding EveryDay 365

interrupt()和interrupted()以及isInterrupted()

这一篇着重分析下线程中断,在C.U.T中,中断是用的比较多的一种技术手段,运用的好能带来很多的便利。1.interrupt() public void interrupt() { if (this != Thread.currentThread()) checkAccess(); synchronized (blockerLock) ...

lwgzj的博客 1161
上一篇: 启动ucosii之四OSTaskCreate()
下一篇: 启动ucosii之八OSStatInit()
IvyOnion
博客等级 码龄15年 35粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值