三 基于DSP/BIOS的程序开发
  基于DSP/BIOS的程序开发是交互式的可反复的开发模式[参考文献6、7、8],开发者可以方便地修改线程的优先级和类型,首先生成基本框架,添加算法之前给程序加上一个仿真的运算负荷进行测试,看是否满足时序要求,然后再添加具体的算法实现代码。
  使用DSP/BIOS开发软件需要注意两点:
  * 所有与硬件相关的操作都需要借助DSP/BIOS本身提供的函数完成,开发者要避免直接控制硬件资源,如定时器、DMA控制器、串口、中断等;
  * 基于DSP/BIOS的程序运行与传统的程序有所不同,传统编写的DSP程序完全控制DSP,程序依次执行,而基于DSP/BIOS的程序,由DSP/BIOS程序控制DSP,用户程序不是顺序执行,而是在DSP/BIOS的调度下按任务、中断的优先级等待执行。
  1. 基于DSP/BIOS的程序开发流程
  下面以数字图像边缘检测(采用sobel算法)为例,具体分析一下DSP/BIOS程序的编写流程,程序的流程图见图2。
  基于DSP/BIOS的程序开发流程一般包括以下几个步骤:
  * 利用配置工具设置环境参数并静态建立应用程序要用到的对象。要注意的是,在配置工具下创建对象为静态创建,对象是不可以删除的,利用xxx_create可以动态创建对象,并可以用xxx_delete删除动态创建的对象(xxx表示模块名字,如TSK)。本程序中,在MEM模块设置片内ISRAM、片外SDRAM的起始地址与长度以及heap的大小,在LOG模块创建事件记录对象用来记录程序的运行情况,在TASK模块创建三个任务进程(Input Task、Process Task、Output Task),并在SEM模块创建旗语对象来进行线程之间的通信,在DEV模块配置所需的外设,这里包括视频采集端口VP0和视频输出端口VP2。
  * 保存配置文件,保存配置文件时,配置工具自动生成匹配当前配置的汇编源文件和头文件以及一个连接命令文件。
  * 为应用程序编写一个框架,可以使用C、汇编语言或C与汇编的混合语言来编程,由于目前C++的编译效率还比较低,在数字图像处理应用中一般不采用C++编程。在CCS环境下编译并连接程序,添加program.cdb和programcfg.cmd到项目工程文件中,其他的文件自动连接进应用程序。如果用户想使用自己的连接命令文件,则需要在自己的命令文件的第一行包含语句“-l programcfg.cmd”。
  * 使用仿真器和DSP/BIOS分析工具来测试应用程序,本程序中使用XDS510PP并口仿真器通过JTEG口连接DM642 EVM与PC机进行调试;
  * 重复上述步骤直至程序运行正确。
  在实际产品开发过程中,当正式产品硬件开发好后,修改配置文件来支持产品硬件并测试。
  2. DSP/BIOS程序的启动过程
  DSP/BIOS的启动过程包括以下几步:
  * 初始化DSP:复位中断向量指向c_int00地址,DSP/BIOS程序从入口点c_int00开始运行。对C6000,初试化堆栈指针(B15)和全局页指针(B14)分别指向堆栈底部与.bss段的开始,控制寄存器AMR、IER和CSR也被初始化;
  * 用.cinit段中的记录来初始化.bss段;
  * 调用BIOS_init初始化DSP/BIOS模块:BIOS_init执行基本的模块初始化,然后调用MOD_init宏分别初始化每个用到的模块;
  * 处理.pinit表:.pinit表包含了初始化函数的指针;
  * 调用应用程序main函数:在所有DSP/BIOS模块初始化之后,调用main函数。由图2可以看到,本程序在main函数中添加了必要的初始化代码。Main函数初始化之后CPU的控制权交给DSP/BIOS。需注意,main函数中一定不能存在无限循环,否则整个DSP/BIOS程序将瘫痪;
  * 调用BIOS_start启动DSP/BIOS:BIOS_start函数是由配置工具产生的,包含在programcfg.s62文件中,它负责使能DSP/BIOS模块并为每个用到的模块调用MOD_startup宏使其开始工作。