马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
本帖最后由 cjsb37 于 2013-4-29 09:02 编辑
在21ic的对头论坛发的,快找不着了也没人会,只好提这来. dsp bios使用的1点心得 我是用c55的dsp bios做1个项目,在这之前没用过任何1种rtos, 所以对dsp bios也只是用点皮毛。 1.ti的dsp bios可以动态产生任务,使用TSK_create,不过ti的文档说, 动态产生的代码,比静态产生的要大至少1倍。所以,1般都通过ccs的 cdb配置工具来声明1个任务。按我的理解,基本上所有ccs提供的资源, 比如mailbox,que等,都跟task类似,静态代码量远小于动态生成的, 所以应该尽量使用cdb。 2。每个任务都是1个TSK_obj型的数据类型,必须将这个任务跟某个函数 对应,这个函数其实内部就是1个死循环,等待消息或信号量执行相应的 处理,如果没等到消息,就被bios内核自动挂起。比如你的这个任务的c函数 是void tsk_proc_a(void),那么在cdb的相应位置填上_tsk_proc_a即可(注意 前面的下划线)。 3。消息传递机制我使用了邮箱和信号量。邮箱做消息队列的主要好处是可以 多个任务向1个消息队列发消息驱动同1个任务。信号量可以用来做任务驱动, 也可以用来实现资源的互斥,唯一的区别是初始值是0还是1。邮箱和信号量 都可以在cdb中定义,使用前必须在用户程序声明为extern MBX_obj和 extern QUE_obj。邮箱在cdb中设置是需要设2个参数,消息宽度,和队列长度。 4。que是dsp bios提供的1个数据结构,我总觉得不是rtos的组成部分。使用 que来做缓冲区管理的确很方便,以后在讲。我不是软件科班出身,对1些常用 的数据结构不了解,看来真得恶补1下。 5。dsp bios得中断管理我认为是这个rtos的1个大缺点(或许我理解有误)。所有 的中断都由dsp bios内核来管理,1有中断则进入调度内核去查询,中断处理程序 其实是bios内核调用的1个回调函数。这个处理方式尽管很方便,但是对有些对 时间要求特别critical的中断,并不合适---因为每次中断都要先进入内核,执行 好几百条指令。中断其实在bios中就是优先级最高的任务,个人是这么感觉的。 6。如果只是把这个rtos用起来,其实很简单的,新手在做的时候可以先看看ti的例子, 然后立即开干,边做边看ti的文档。 举个例子.. extern MBX_obj mbx1,mbx2; #define MSG_START 100 #define MSG_STOP 200 #define MSG_NULL 0 void tsk_proc(void)//任务处理模块,接收消息并处理 { Uint16 msg; whie(1) { MBX_pend(&mbx1,&msg,SYS_FOREVER); //如果消息队列空,则此任务交出控制权。最后1个参数是设置超时tick数,这里1直死等 if( msg== MSG_START ) { //add code } else if(msg==MSG_STOP) { //add code } } } void pcm_isr(void) //中断处理函数,每1定数量的数据采样dma中断1次 { //add code,处理dma设置 MBX_post( &mbx1, MSG_START,0); //最后1个参数是超时tick,这里0表示如果邮箱满则不等待邮箱释放,立即返回 } void main_ctrl(void) { while(1) { //add code ,接受并解析上位机的命令 switch( cmd ) { .......... case 1000://主机命令,停止工作 MBX_post(&mbx1, MSG_STOP,0); } } } tsk_proc和main_ctrl是cdb中定义的任务处理函数,mbx1是邮箱队列。 cdb中定义tsk要定义优先级,数字越大越优先。bios自带的idle任务是 0优先级。 这个帖子是在家里凭记忆写的,有些函数和数据原型不一定正确,请自行查证。
|