tag 标签: dsp/bios

相关博文
  • 热度 16
    2012-1-12 21:33
    4447 次阅读|
    0 个评论
    DSP/BIOS:Cannot create/delete a Clock from Hwi or Swi thread 上篇文章提到Task_sleep睡死的问题解决后,添加了系统心跳clock,所有API用到ticks的都可以正常使用了. 但是调试串口的时候还是遇到其他问题了: ti.sysbios.knl.Clock: line 432: assertion failure: A_badThreadType: Cannot create/delete a Clock from Hwi or Swi thread. xdc.runtime.Error.raise: terminating execution 调试进入到Clock模块的某个函数(要么是创建函数要么是析构函数)时候,asser会判断当前调用线程是否是Hw中断或者软件中断,如果是 则产生异常,最后出现以上错误.但是我想,我的串口中断函数怎么和Clock模块发生关系了?忽然想起文档中的一句话:如果系统心跳tick没有的话 ,所有用到tick的API出现除0和forever外的值,都会有问题. 回头检查了下串口中断的函数,里面用到了mailbox,出现了一个10tick的超时! Mailbox_post(SCI_Msg_MailBox, (Ptr)Buffer, 10); 修改后如下: Mailbox_post(SCI_Msg_MailBox, (Ptr)Buffer, BIOS_NO_WAIT); 中断中不能出现无限等待这是一定的,但是如果一些信号量或者邮箱等出现了要用到tick来计量的超时值的时候, DSP/BIOS的clock模块在每一个需要超时值的地方动态建立一个clock,然后start计时.....问题这里是中断啊.
  • 热度 20
    2012-1-12 21:28
    9605 次阅读|
    0 个评论
    程序其中的一个任务调用了Task_sleep(100),结果睡死在里面,用ROV查看任务的状态,Blocked阻塞,但是阻塞点是Unknown. 这是因为没有添加clock模块到系统的原因,或者设置的系统心跳的定时器为NULL或者USER,这种情况下,有关tick的API 还可以照常调用,但是除了超时值0或者forever外其他值都无效. 用ROV查看clock模块的状态,可以看到系统的心跳驱动源配置为NULL,然后计时的值也恒定不变,为0. 查看timer模块,也可以看到,系统心跳的定时器没有,就是用来do timetick的. 解决方法是: 1.在runtime里面打开clock manager. 2.添加clock模块,设置如下,tick源为定时器,至于那个定时器,看系统配置,28335是0,1,2三个定时器. 3.编译运行,然后暂停,ROV查看clock模块,可以看到系统添加了一个clock,ticks值会心跳了. 4.clock模块驱动源配置为timer,就是依赖timer来完成,所以系统自动生成了一个无名timer,来完成dotick的功能.
  • 热度 17
    2010-10-14 13:11
    4586 次阅读|
    1 个评论
    1、DMA Config中用到的地址指针必须先在程序中定义好,并加"far"约束。 2、进入DSP/BIOS配置工具后,必须先将用到的所有指针变量在“CSL Extern Declaration”中定义好(右击“CSL Extern Declaration”,选“Insert”,右击变量名, 选“rename”,再选“Properties”,进入属性页进行修改)。 3、点击“DMA Configuration Manger”可插入dmacfg0~3,亦可对现有的dmacfg0~3进行修改,但要注意如下两点: (1)Source/Destination中要设定源/目的地址的格式,如果是数字选“Numeric”,是指针变量则选“Extern Decl. Obj”,否则随后输入的地址无效。 (2)如果地址是指针变量,该变量必须是上述2中已定义的,否则输入、修改无效。 4、在“DMA Resource Manger”中DMA Channel 0~3的属性中将damcfg0~3与通道关联,反之,要删除某个dmacfg必须先取消其关联属性,否则无法删除("delete"是灰色的)。 5、启用DSP/BIOS后,DSP应用程序编译、连接后运行顺序如下:    _C_int00();    _BIOS_init();    main();         //用户主程序入口,仅执行一次    BIOS_start();    IDL_loop();  //循环执行 这里有三点必须注意: (1)用户主函数main()仅执行一次,不是循环执行。 (2)BIOS_start()中含有一些BIOS初始化工作,而main()又在它之前执行,因此某些DSP/BIOS API函数不能在main()中调用,如:在定时器启动前(有BIOS_start()完成), 在main()中不能调用CLK_gettime()。详细介绍参阅TI公司的DSP/BIOS API使用指南。 (3)如果用户程序某个函数需要循环执行,可将其家人IDL_loop()中,具体方法是:打开DSP/BIOS配置工具,展开“Scheduling”,右击“IDL_IDL Functoin MAnger”, 选择“Insert IDL”插入一个"IDL0",在其属性页中将函数名加入即可。注意函数名前加下划线"_"。如不需要循环执行了,将“IDL0”删除即可。
  • 热度 19
    2010-10-11 11:15
    2893 次阅读|
    0 个评论
    1.用CCS打开/创建工程时,工程存放的路径名中不能有中文!(不像VS6、ISE等可以使用任意路径名) 2.国产并口DSP仿真器有些是采用CPLD仿真代替SMC34C60(该芯片已停产),仿真功能不全,只能在并口的EEP模式下使用。原装的仿真器采用SMC34C60,可在SPP、EPP、EPP+ECP三种模式下使用。此外,国产并口DSP仿真器(如开发板之家生产的)除了并口要选择EPP模式外,还要将并口中断IRQ7设置成“保留”(Reserve),不能设置成PnP(Default)。 3.如果DSP的用户程序存放在外部Flash中,必须关电重新加电(即“冷启动”)才能加载(Boot)到DSP中运行,用人工复位(“热启动”)方法不起作用。 4.DSP/BIOS提供的标准模块中,每个模块的属性可在配置时修改参数(静态设定),也可在程序中(一般在main中)使用参数修改指令动态设置,例如周期模块PRD(假设用户新建的对象名为PRD0)的Period,参数,修改指令:PRD0.period=xxx;但有些参数是不能修改的,能修改的参数当用户在编辑状态下输入PRD0后,CCS会自动提示的。 5.CCS源程序编辑器缺省状态是“Insert”,即可插入/修改源代码,如果不小心按了“Insert”键,编辑器就进入“修改”状态,“Delete”、“Back Space”等键就不起作用了,必须再按一次“Insert”才能恢复。 6.使用DSP/BIOS配置工具定义变量和数组等,在源程序中必须使用“far”关键字来声明。far说明的变量存放在.far段,其它变量(全局静/态)则存放在.bss段,.bss段中变量存取速度比.far中的快些。 7.在DSP/BIOS配置工具中定义的函数名前必须加下划线“_”,因为配置工具生成的是汇编代码,而汇编代码中调用C函数就要求函数名家下划线。