zoukankan      html  css  js  c++  java
  • DSP/BIOS程序启动顺序

    DSP/BIOS 模块

    基于TI的DSP芯片的应用程序分为两种:一般应用程序;DSP/BIOS应用程序。

    为简化编程,TI提供了一套C的编程接口,它以API和宏的形式封装了TI的所有硬件模块,这套接口统称DSP/BIOS。DSP/BIOS包含以下模块:

    • System(包含MEM,SYS对象)
    • Instrumentation(包含LOG,STS对象)
    • Scheduling(包含CLK,PRD,HWI,SWI等等对象)
    • Synchronization(包含SEM,MBX,QUE等等对象)
    • Input/Output(包含RTDX,HST等等对象),Chip Support Library(包含DMA,GPIO等等对象)。

    DSP/BIOS程序启动顺序  

    • 初始化DSP。DSP/BIOS程序从入口c_int00开始。复位后,复位中断向量将程序指针自动引导到c_init00。系统堆栈指针SP设置成指向.stack段的结尾,状态寄存器st0和st1也被初始化。
    • 从.cinit段的记录来初始化.bss段,堆栈指针建立后,初始化程序使用.cinit段的记录来初始化全局变量。
    •  调用BIOS_init初始化DSP/BIOS的各个模块。BIOS_init执行基本的模块初始化,然后调用MOD_init宏分别初始化每个使用的模块。例如,HWI_init初始化有关硬件中断的寄存器,建立ISTP和中断选择寄存器,清除IFR中断标志寄存器,设置IER中断使能寄存器;HST_init初始化主机接口I/O通道接口,如果使用了RTDX,则HST_init将IER中对应RTDX硬件中断的相应位置置1;IDL_init初始化空闲循环的指令计数,主要来校正CPU负荷图来显示CPU的负担。
    • 处理.pinit表。.pinit表包含了初始化函数的指针,对于C++程序,全局C++对象的构造函数会在pinit的处理中执行。
    • 调用用户主程序main函数。在所有的DSP/BIOS模块初始化后,硬件中断和软件中断均为使能,此时应用程序可以添加代码初始化各种外设。在初始化过程中,必须保持禁止各种中断。
    • 调用BIOS_start启动DSP/BIOS。和其他函数一样,BIOS_Start函数也是由配置工具产生的,该函数包含在programcfg.snn文件中。BIOS_start负责使能DSP/BIOS模块并为每一个使用的模块调用MOD_startup宏使其开始工作。例如,CLK_startup设置PRD寄存器,使能IR寄存器中对应CLK管理器中所选时钟的位置1,然后启动时钟;SWI_startup设置软件中断,TSK_startup使能所有任务线程。HWI_startup设置CSR寄存器中的GIE位,使能硬件中断;PIP_startup为每个PIP对象调用notifywriter函数。如果配置工具中TSK管理器是使能的,那么BIOS_startup不会返回。
    •  执行空闲循环。调用IDL_loop引导程序进入DSP/BIOS空闲循环,此时硬件和软件中断可以中止空闲循环的执行。空闲循环控制DSP和主机的通道,空闲循环时主机和DSP系统之间可以进行数据通信。 

    在DSP/BIOS应用程序中,main()函数用于实现用户的初始化操作,片内/片外外设的配置,以及使能单独的硬件中断等,然而,main()函数并不属于DSP/BIOS的任何线程类型,它仅仅是一个匆匆过客,在作完用户期望的初始化之后,也就寿终正寝了。

    值得注意的一点是,应用程序在执行main函数时,并不是所有的DSP/BIOS API函数都可以调用,其间有着相应的先后关系,这是因为,main函数启动的时候,DSP/BIOS并没有完成最终的初始化,因此,main函数对于DSP/BIOS 有些API函数的调用是受限的。

    从DSP启动的过程来看,DSP/BIOS的初始化是分为两大阶段的,一个是位于main函数前面的BIOS_init中,一个是在main函数后面的BIOS_start中。

    BIOS_init所主要完成的是MEM模块的初始化工作,而BIOS_start负责的是使能全局中断、配置和启动定时器、打开线程调度、启动DSP/BIOS线程等。因此,在main函数中,可以调用实现动态存储器分配的函数:MEM_alloc、MEM_free;以及动态创建对象的API 函数:XXX_create、XXX_delete等。对于“假设硬件中断和定时器都已经使能的API”、或者可能引起阻塞的API函数都不可以在main函数中调用,例如CLK_gethtim、CLK_getltime、HWI_enable、HWI_disable、SWI_enable、SWI_diaable、TSK_disable、TSK_enable、SEM_pend、MBX_pend等。特别需注意的是,main函数中一定不能存在无限循环,否则整个DSP/BIOS程序将瘫痪。

    但是对于使DSP/BIOS线程就绪的调度函数却允许在main函数中调用,例如SEM_post、SWI_post等,其实质还是在等BIOS_start进行完所有的初始化后再执行如上的调度操作。

    因此可以明白一点的是,main函数穿插在BIOS的初始化过程中,为人工干预DSP/BIOS的启动提供了机会,使得BIOS的运作更具“个性化”。其间CPU的控制权从DSP/BIOS提交给用户,然后在返回给DSP/BIOS。

  • 相关阅读:
    2019-2020-1 20175208 20175218 20175230 实验一 开发环境的熟悉
    C代码统计脚本修改
    2019-2020-1 20175218 《信息安全系统设计基础》第1周学习总结
    2018-2019-2 20175218 实验五《网络编程与安全》实验报告
    第十二周测试总结分析
    2019-2020-2 网络对抗技术 20175236 EXP9 Web安全基础实践
    2019-2020-2 网络对抗技术 20175236 EXP8 Web基础
    2019-2020-2 网络对抗技术 20175236 EXP7 网络欺诈防范
    2019-2020-2 网络对抗技术 20175236 EXP6 MSF基础应用
    2019-2020-2 网络对抗技术 20175236 EXP5 信息搜集与漏洞扫描
  • 原文地址:https://www.cnblogs.com/xiaojianliu/p/8649752.html
Copyright © 2011-2022 走看看