打印

都是中断为甚么用bios实现就不行?搞不出来下个月就要被辞

[复制链接]
4208|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ccjchen|  楼主 | 2009-6-24 16:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用普通的中断方式实现uart串口通信可以, 
但用bios 方式中断却没有中断产生不知为什么?
恳请各位高手给指点一下!万分感激!
公司买的开发板,在上面做DM642做UART串口通信实验。它是由一个外围芯片TL16C752B提供两个中断请求信号INTA、INTB分别用于通道A和B申请TMS320DM642的中断。在DM642中,INTA和ITB相与,复用DM642的INT5.
大家帮看一下哪里bios写的程序哪里存在问题?
这是普通方式实现的程序:
#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_reset(IRQ_EVT_EXTINT5);
    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... ");
    /* Loop through 256 bytes */
   /*  for (;;)
  {
        
        buffer = SEEDDM642_UART_getChar(SEEDuartHandleA);
    //    buffer  = 0x55;
        SEEDDM642_UART_putChar(SEEDuartHandleA, (buffer & 0xff));  
   }*/
   while(1);

}

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



下面为用bios方式写的程序:
#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_Reset(IRQ_EVT_EXTINT5);
    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);
 
     printf("Uart Test Begin... ");

}

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

相关帖子

沙发
yxwsz| | 2009-6-24 23:28 | 只看该作者

你的程序不死才怪

在ISR里面使用printf,不出问题才怪。
如果我在你后面,一定会往你屁股上踢一脚。

使用特权

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

谢谢,yxwsz!不过我的程序好像根本就没进中断啊

在ISR中为什么不能用Printf,我看到一个非bios例程中,isr中就有Printf,难道bios编程里不能使用吗?

使用特权

评论回复
地板
ccjchen|  楼主 | 2009-6-25 09:42 | 只看该作者

在ISR里面把printf去掉还是不行

为什么不用bios中断就非常正常呢?还请高人给小弟指点一下!
就算不在这个公司我也想知道这是为什么?以后还要靠它吃饭呢!

使用特权

评论回复
5
ccjchen|  楼主 | 2009-6-25 10:20 | 只看该作者

万分感激yxwsz!

确实不能在bios里面加printf函数,现在去掉就好了!
妈的,整了我一个月,终于出来了!
你真是伟大的导师啊!
给解释一下bios的isr中为什么不能加printf函数好吗?

使用特权

评论回复
6
northelec.com| | 2009-6-25 11:45 | 只看该作者

bios设置:BIOS中断

AL=00 40×25黑白方式
AL=01 40×25彩色方式
AL=02 80×25黑白方式
AL=03 80×25彩色方式
AL=04 320×200彩色图形方式
AL=05 320×200黑白图形方式
AL=06 320×200黑白图形方式
AL=07 80×25单色文本方式
AL=08 160×200 16色图形 (PCjr)
AL=09 320×200 16色图形 (PCjr)
AL=0A 640×200 16色图形 (PCjr)
AL=0B 保留(EGA)
AL=0C 保留(EGA)
AL=0D 320×200 彩色图形 (EGA)
AL=0E 640×200 彩色图形 (EGA)
AL=0F 640×350 黑白图形 (EGA)
AL=10 640×350 彩色图形 (EGA)
AL=11 640×480 单色图形 (EGA)
AL=12 640×480 16色图形 (EGA)
AL=13 320×200 256色图形 (EGA)
AL=40 80×30 彩色文本(CGE400)
AL=41 80×50 彩色文本(CGE400)
AL=42 640×400 彩色图形(CGE400)

使用特权

评论回复
7
northelec.com| | 2009-6-25 11:47 | 只看该作者

BIOS 中断调用表(INT n)

BIOS 中断调用表(INT n) 

http://teacher.swun.edu.cn/teacher_manage/upload/2009042910263865.pdf
相关链接:http://teacher.swun.edu.cn/teacher_manage/upload/2009042910263865.pdf

使用特权

评论回复
8
因特网用户| | 2009-6-25 12:36 | 只看该作者

mark

使用特权

评论回复
9
yidong1981| | 2009-6-25 12:50 | 只看该作者

如果用DSP/BIOS的话

那就最好不用printf(),DSP/BIOS提供了一个对应的函数:LOG_printf()

使用特权

评论回复
10
ccjchen|  楼主 | 2009-6-25 14:01 | 只看该作者

谢谢yidong1981

northelec.com搞的什么东西,看不懂啊。打广告的又不像

使用特权

评论回复
11
yxwsz| | 2009-6-25 14:25 | 只看该作者

printf是不可重入函数(non-reentrant)

printf是不可重入函数(non-reentrant);
并且很消耗CPU资源,你找个vsprintf的代码看看就清楚了;
很明显,UART中断频率非常高,因此在中断里面调用printf会很耗时;

非多任务程序里面,如果使用了中断,相当于系统里面有两个任务:ISR、主程序;随时ISR随时会打断主程序的执行,如果主程序中也使用了printf,那printf很容易就重入了。

使用特权

评论回复
12
ccjchen|  楼主 | 2009-6-26 13:34 | 只看该作者

谢谢 yxwsz!

学了不少!

使用特权

评论回复
13
jxin| | 2009-6-29 11:08 | 只看该作者

学习了学习了

使用特权

评论回复
14
bjc125| | 2009-7-8 11:14 | 只看该作者

Mark

最近也在研究DSP 

学习了

使用特权

评论回复
15
nealfei| | 2009-9-18 23:30 | 只看该作者
有些收获,谢谢各位!

使用特权

评论回复
16
原野牧歌| | 2009-9-23 15:37 | 只看该作者
学习了。还没有入门,哈哈。

使用特权

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

本版积分规则

175

主题

446

帖子

1

粉丝