打印

用bios编写Hwi硬件中断函数还需要在主函数中加循环吗?

[复制链接]
3471|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ccjchen|  楼主 | 2009-6-21 10:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
过去编程时都要main主函数中都会有for或while 循环,否则main函数只运行一次,就结束了
现在我手里面有个开发板供应商提供的用bios编写的network程序,用的是TSK_network任务函数。main()函数中没有for或while循环,如果在结尾加上比如while(1);程序就不能运行了
DSP/BIOS提供四种不同的线程:Hwi,Swi,Tsk,Idle;
请问各位高手是不是在bios编写的程序中不能有while(1)这种循环等待存在呢?还是只有Tsk不能,而Hwi可以呢? 

相关帖子

沙发
px99| | 2009-6-21 12:00 | 只看该作者

我的看法

根据实际需要,关键是自己要清楚自己的程序将要如何跑?

使用特权

评论回复
板凳
ccjchen|  楼主 | 2009-6-21 16:25 | 只看该作者

你说的很对啊,可惜我在这方面功力还不深

附件中的程序是开发板供应商提供的已经调试好的用于DM642的TCP/IP的NDK程序。在main()函数结尾为什么不能加while(1)循环呢?也不能加for循环进去。要往里继续加程序不好办啊,难道这就是多线程编程的缘故吗?
相关链接:https://bbs.21ic.com/upfiles/img/20096/200962116179664.rar

使用特权

评论回复
地板
px99| | 2009-6-21 19:58 | 只看该作者

添加个任务

在任务里添加程序代码

使用特权

评论回复
5
alex74| | 2009-6-21 21:55 | 只看该作者

千万别在main里面加

bios文档好好看看。注意看他的初始化流程。
main里面不能加死循环的。

使用特权

评论回复
6
hotpower| | 2009-6-21 22:09 | 只看该作者

main里一句话都可以不要,这是DSP Bios的特点

使用特权

评论回复
7
ccjchen|  楼主 | 2009-6-21 22:12 | 只看该作者

如果我要用到中断的话

是不是也得用bios添加中断才可以啊?
如果用bios添加中断的话,直接用bios中的HWI添加就可以了吧,还是需要用bios中的任务添加中断呢?

使用特权

评论回复
8
yidong1981| | 2009-6-22 08:46 | 只看该作者

dsp/BIOS的流程

如果使用了BIOS的话,那么main中只要完成一些初始化函数就可以了,如果main中加了死循环,那么就永远挑不出来,进入到任务调度了,那些Hwi,Swi,Tsk,Idle线程就得不到执行

使用特权

评论回复
9
yidong1981| | 2009-6-22 08:48 | 只看该作者

中断当然是在HWI中添加了

如果用bios添加中断的话,直接用bios中的HWI添加就可以了吧,还是需要用bios中的任务添加中断呢?
需要在HWI中添加中断处理函数

使用特权

评论回复
10
zhongxon| | 2009-6-22 09:06 | 只看该作者

re

在main.c中或在其他文件中的 线程里面(TSK),如果有for或while做的无限循环,那么在循环当中就得有TSK_sleep(xx),否则程序一旦进入那个线程,就会出不来了。尽量不用while,或用消息等待机制。。。

使用特权

评论回复
11
ccjchen|  楼主 | 2009-6-22 11:26 | 只看该作者

我用普通的中断方式实现uart串口通信可以,

但用bios 方式中断却没有中断产生不知为什么,下面这个程序有错吗?
我买的开发板,在上面做DM642做UART串口通信实验。它是由一个外围芯片TL16C752B提供两个中断请求信号INTA、INTB分别用于通道A和B申请TMS320DM642的中断。在DM642中,INTA和ITB相与,复用DM642的INT5.

#include <csl.h>
#include <csl_emifa.h>
#include <csl_irq.h>
#include <csl_chip.h>
#include "stdio.h"

#include "seeddm642.h"
#include "seeddm642_uart.h"

/*SEEDDM642的emifa的设置结构*/
EMIFA_Config Seeddm642ConfigA ={
       0x00052078,/*gblctl EMIFA(B)global control register value */
                     /*将CLK6、4、1使能;将MRMODE置1;使能EK2EN,EK2RATE*/
       0xffffffd3,/*cectl0 CE0 space control register value*/
                     /*将CE0空间设为SDRAM*/
       0x73a28e01,/*cectl1 CE1 space control register value*/
                     /*Read hold: 1 clock;
                       MTYPE : 0000,选择8位的异步接口
                       Read strobe :001110;14个clock宽度
                       TA:2 clock; Read setup 2 clock;
                       Write hold :2 clock; Write strobe: 14 clock
                       Write setup :7 clock
                       --                     ---------------
                                    14c        /1c
                           ----------------/ */
       0x22a28a22, /*cectl2 CE2 space control register value*/
       0x22a28a42, /*cectl3 CE3 space control register value*/
       0x57115000, /*sdctl SDRAM control register value*/
       0x0000081b, /*sdtim SDRAM timing register value*/
       0x001faf4d, /*sdext SDRAM extension register value*/
       0x00000002, /*cesec0 CE0 space secondary control register value*/
       0x00000002, /*cesec1 CE1 space secondary control register value*/
       0x00000002, /*cesec2 CE2 space secondary control register value*/
       0x00000073 /*cesec3 CE3 space secondary control register value*/    
};

SEEDDM642_UART_Config UartConfig ={
       0x01,/*寄存器IER*/
       0x57,/*寄存器FCR*/
       0x03,/*寄存器LCR*/
       0x08,/*寄存器MCR*/
};

extern far void vectors();

Uint8 IOreadback;
Uint16 buffer;
SEEDDM642_UART_Handle SEEDuartHandleA;
SEEDDM642_UART_Handle SEEDuartHandleB;

/*此程序可将四个采集口的数据经过Video Port0送出*/
void main()
{
    
/*-------------------------------------------------------*/
/* perform all initializations                           */
/*-------------------------------------------------------*/
    /*Initialise CSL,初始化CSL库*/
    CSL_init();
/*----------------------------------------------------------*/
    /*EMIFA的初始化,将CE0设为SDRAM空间,CE1设为异步空间
     注,DM642支持的是EMIFA,而非EMIF*/
    EMIFA_config(&Seeddm642ConfigA);
/*----------------------------------------------------------*/
    IRQ_globalDisable();
    IRQ_nmiEnable();
    
    IRQ_enable(IRQ_EVT_EXTINT5);
    IRQ_globalEnable(); 
    /*中断向量表的初始化*/
    //Point to the IRQ vector table
   
   
/*测试串口A*/
    /* Open UART */
    SEEDuartHandleA = SEEDDM642_UART_open(SEEDDM642_UARTA, 
                                          SEEDDM642_UART_BAUD9600, 
                                          &UartConfig);
    /*Open UARTB*/
    SEEDuartHandleB = SEEDDM642_UART_open(SEEDDM642_UARTB, 
                                          SEEDDM642_UART_BAUD9600, 
                                          &UartConfig);
     IRQ_setVecs(vectors);
     printf("Uart Test Begin... ");

}

    interrupt void uart_isr(void)
    {
      Uint16 Data_Temp;
      Data_Temp = SEEDDM642_UART_rget(SEEDuartHandleA,0);
      printf("DATA : %x ",Data_Temp);
    } 

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

175

主题

446

帖子

1

粉丝