DSP学习笔记

DSP 学习笔记

[TOC]

芯片选型

TI系列

  1. C6000系列:C62xx,C64xx,C67xx,主要公寓宽带网络和数字影像领域,而数字影像领域多使用固定点数(32bit)DSP,而雷达多使用浮点DSP.

    TMS320C6455 主要参数:

  • fixed-point DSP,单核,
  • 720MHz主频
  • 32K-Byte ROM
  • 512M-Byte扩展DDR2/SDRAM
  • 697-Pin BGA封装
  1. C5000系列: 主打低功耗
  2. C2000系列: 用于工业控制

ADI系列

ADSP-21367 SHARPC Floating-Point

硬件设计

软件开发

IDE(CCS5.3 + External Editor)

使用外部的Editor进行Code

Looking to use an external editor for source code with CC V5. I went to preferences->general->editors->file associations, added *.c and *.h to "file types" window, added my editor executable to "associated editors" window and clicked default for each.

暂未找到合适的方法

直接在Sublime中修改

  1. 在CCS中建好工程,添加好文件;
  2. 把工程所在文件夹拖入sublime中
  3. 编译好后,在CCS中更新

DSP/BIOS RTOS与多线程

DSP/BIOS

DSP/BIOS 并不是真正的实时操作系统,并且不包含网络功能;

DSP/BIOS 由三部分组成,即:

  1. DSP/BIOS 实时库和API;
  2. DSP/BIOS 配置工具,提供可视化的编程环境
  3. DSP/BIOS 插件,用于支持调试过程

TI为cC6000系列推出了TCP/IP NDK, 包括应用层的telnet, DHCP, HTTP等.

由于NDK已经提供了完整的TCP/IP库函数,程序员开发的代码只须按需要进行配置即可。下面是将嵌入式设备配置为车间局域网节点的核心代码, 为了让NetworkConfig与系统中的其它功能绑定在一起,可以通过开发平台创建一个TSK任务管理器对象,并将其定义为一个独立的线程任务。这样,TCPStackStart就加入到嵌入式系统中了。

char *LocalIPAddr ="128.247.117.12";
char *LocalIPMask ="255.255.254.0";
char *GatewayIP ="128.247.116.1";
char *DomainName ="demo.net";
int NetworkConfig()
{
  int rc;
  CI_IPNET NA;
  CI_ROUTE RT;
  HANDLE hCfg;
  NC_SystemOpen();
// Create a new configuration TCP/IP Stack Initialization and Configuration
  hCfg = CfgNew();
  if( !hCfg )
  { goto main_exit; }
// Manually configure our local IP address
  bzero( &NA, sizeof(NA) );
  NA.IPAddr = inet_addr(LocalIPAddr);
  NA.IPMask = inet_addr(LocalIPMask);
  strcpy( NA.Domain, DomainName );
  NA.NetType = 0;
// Add the address to interface 1
  CfgAddEntry( hCfg, CFGTAG_IPNET, 1, 0,
  sizeof(CI_IPNET), (UINT8 *)&NA, 0 );
// Add the default gateway.
  bzero( &RT, sizeof(RT) );
  RT.IPDestAddr = 0;
  RT.IPDestMask = 0;
  RT.IPGateAddr = inet_addr(GatewayIP);
// Add the route
  CfgAddEntry( hCfg, CFGTAG_ROUTE, 0, 0,
  sizeof(CI_ROUTE), (UINT8 *)&RT, 0 );
  do
  {
  rc = NC_NetStart( hCfg, NetworkStart, NetworkStop, NetworkIPAddr );
  } while( rc > 0 );
// Delete Configuration
  CfgFree( hCfg );
// Close the OS
  main_exit:
  NC_SystemClose();
  return(0);
}

多线程

C6455对易变的量(volatile)做出反应的子模块叫做线程(Threads),多线程在单核处理器上运行会按照优先级执行

DSP/BIOS 通过四种任务形式控制任务优先级,其中:HWI>SWI>TSK>IDL(Background Thread),在CCS中可通过configuration.tcf->scheduling 查看.

HWI中包含了CLK功能:

Triggered at the rate of the on-device timer interrupt.

SWI中包含了PRD功能:

Use PRD functions when you want a function to run at a rate based on a multiple of the on-device timer.s low-resolution rate or another event (such as an external interrupt). These functions run as SWI functions.

抢占式程序调度:当多个线程就绪时,抢占式调度算法会挑选一个程序执行,到达一定时间后(一般为20ms~50ms)若该程序仍在运行,他就会被挂起,然后选择一个已就绪程序执行

非抢占式程序调度:程序运行直到阻塞或自动释放CPU,中断发生时不会调度

多线程实现函数:

Tsk_yield();//用于将自己挂起(Pend),交给下一个Tsk

MBX_pend(mbx,msg,timeout);//mailBox函数在synchronization中,一般用于在不同tsk间传递参数
    //如果mbx不为空,将复制其中的第一个数据到msg指定的地址并且返回TRUE.
    //如果为空,这个任务将被挂起,直到MBX_post函数被调用或者timeout设置的时间到.
    //如果timeout的值是SYS_FOREVER,那这个任务将一直挂起,直到MBX_post函数被调用
    //如果timeout的值是0,那么将立即返回FALSE.

SEM_pendBinary(&Sem_Tsk,SYS_FOREVER);//采用这种方式等待调用Sem_Tsk线程    

添加Tsk任务模块

新建DSP/BIOS Configuration File/直接打开cfg-> 进入Configuration Tool->InsertTsk->定义Tsk Function;

编写任务函数:


#include 
#include 
#include 
#include 
#include 

void func_tsk0(void);
void func_tsk1(void);

void main(int argc, char const *argv[])
{
    system_printf();
    BIOS_start();
}

void func_tsk0(void)
{
    int count = 0;
    while(count<10)
    {
        Log_info1("task0 %d\n",count); //打印日志信息
        Task_yield(); //优先级调度函数,如果有相同priority的函数,则调度到同优先级的其他函数执行
        count++;
    }
    BIOS_exit(0);
}

void func_tsk1(void)
{
    int count = 0;
    while(count<10)
    {
        Log_info1("task1 %d\n",count);
        Task_yield(); //优先级调度函数,如果有相同priority的函数,则调度到同优先级的其他函数执行
        count++;
    }
    BIOS_exit(0);
}

添加SWI任务模块
  1. 添加一个全局的 SWI Handle;
  2. 初始胡Swi 参数;
  3. 创建软件中断;
  4. 编写中断服务程序
  5. 更改软件中断计数器 trigger,

关于任务执行状态

  • pend 阻塞: Tsk等待信号输入,无法确切知道何时恢复;或被高优先级Tsk抢占时阻塞

  • suspend 挂起: 用于调试过程,类似于加断点,只有resume之后才会ready

  • sleep 睡眠: 挂起给定时间

  • yield : 直接转到ready状态的任务

  • synchronous 同步/asynchronous 异步: 发出调用后,在未收到结果之前不返回值.>

flash烧写

对于TMS320LF24XX,TMS320LF28xx利用CCS里面自带的flash burn插件进行烧写。

对于TMS320C64xx(包括C6211)需要自己手工编写BootLoader 烧写的程序,写入flash中。

利用通用的HEX6x工具实现flash烧写

由于C6000系列的DSP Flash Bootload时,采用2级引导方式,板卡上电引导时,DSP会自动搬移1K字节Flash空间的内容到0~0x400片内ISRAM空间,在进行应用程序的cmd文件中必须为Bootloader保留0~0x400的片内ISRAM空间。

  1. 将Boot.asm的程序加入到用户程序中,将其地址分配为0x00~0x400;
  2. 编写HEX转换到的CMD文件;
  3. 利用HEX6x工具,将OUT文件转换成为HEX文件;
  4. 将之烧写到flash.

利用flashburn工具烧写

  1. 将自己工程中生成的***.out 文件改名为flash.out.复制到C6455_flashburn\hex2image文件目录下
  2. 运行test2.bat
  3. 将C6455_flashburn\hex2image目录下的TI_ARR.C文件复制到上一目录C6455_flashburn替代此目录下的TI_ARR.C文件
  4. 在CCS中加载C6455_flashburn\ Flashburn.pjt工程重新编译工程,将编译生成的C6455_flashburn\Debug\ Flashburn.out下载到DSP中运行。当显示WRITE DONE!!时烧写结束并成功。

网络烧写

由于C6000系列的DSP Flash Bootload时,采用2级引导方式,板卡上电引导时,DSP会自动搬移1K字节Flash空间的内容到0~0x400片内ISRAM空间,在进行应用程序的cmd文件中必须为Bootloader保留0~0x400的片内ISRAM空间。

你可能感兴趣的:(DSP学习笔记)