hal_misc.c

来自「eCos操作系统源码」· C语言 代码 · 共 587 行 · 第 1/2 页

C
587
字号
    for (p = &__CTOR_END__[-1]; p >= __CTOR_LIST__; p--)        (*p) ();#endif    } // cyg_hal_invoke_constructors()/*------------------------------------------------------------------------*//* Determine the index of the ls bit of the supplied mask.                */cyg_uint32 hal_lsbit_index(cyg_uint32 mask){    cyg_uint32 n = mask;    static const signed char tab[64] =    { -1, 0, 1, 12, 2, 6, 0, 13, 3, 0, 7, 0, 0, 0, 0, 14, 10,      4, 0, 0, 8, 0, 0, 25, 0, 0, 0, 0, 0, 21, 27 , 15, 31, 11,      5, 0, 0, 0, 0, 0, 9, 0, 0, 24, 0, 0 , 20, 26, 30, 0, 0, 0,      0, 23, 0, 19, 29, 0, 22, 18, 28, 17, 16, 0    };    n &= ~(n-1UL);    n = (n<<16)-n;    n = (n<<6)+n;    n = (n<<4)+n;    return tab[n>>26];}/*------------------------------------------------------------------------*//* Determine the index of the ms bit of the supplied mask.                */cyg_uint32 hal_msbit_index(cyg_uint32 mask){    cyg_uint32 x = mask;        cyg_uint32 w;    /* Phase 1: make word with all ones from that one to the right */    x |= x >> 16;    x |= x >> 8;    x |= x >> 4;    x |= x >> 2;    x |= x >> 1;    /* Phase 2: calculate number of "1" bits in the word        */    w = (x & 0x55555555) + ((x >> 1) & 0x55555555);    w = (w & 0x33333333) + ((w >> 2) & 0x33333333);    w = w + (w >> 4);    w = (w & 0x000F000F) + ((w >> 8) & 0x000F000F);    return (cyg_uint32)((w + (w >> 16)) & 0xFF) - 1;}/*------------------------------------------------------------------------*//* Delay for some number of useconds.                                     */void hal_delay_us(int us){    cyg_uint32 val1, val2;    int diff;    long usticks;    long ticks;    // Calculate the number of counter register ticks per microsecond.        usticks = (CYGNUM_HAL_RTC_PERIOD * CYGNUM_HAL_RTC_DENOMINATOR) / 1000000;    // Make sure that the value is not zero. This will only happen if the    // CPU is running at < 2MHz.    if( usticks == 0 ) usticks = 1;        while( us > 0 )    {        int us1 = us;        // Wait in bursts of less than 10000us to avoid any overflow        // problems in the multiply.        if( us1 > 10000 )            us1 = 10000;        us -= us1;        ticks = us1 * usticks;        HAL_CLOCK_READ(&val1);        while (ticks > 0) {            do {                HAL_CLOCK_READ(&val2);            } while (val1 == val2);            diff = val2 - val1;            if (diff < 0) diff += CYGNUM_HAL_RTC_PERIOD;            ticks -= diff;            val1 = val2;        }    }}/*------------------------------------------------------------------------*/void hal_arch_program_new_stack(void *_func){    externC void hal_program_new_stack( void *func, CYG_ADDRESS addr);    hal_program_new_stack( (void *)_func,                   (CYGMEM_REGION_ram + CYGMEM_REGION_ram_SIZE - sizeof(CYG_ADDRESS)) & ~15 );}/*------------------------------------------------------------------------*//* Idle thread action                                                     */#include <cyg/infra/diag.h>void hal_idle_thread_action( cyg_uint32 count ){#if 0 //def CYGPKG_HAL_MIPS_SIM    if( (count % 1000) == 0 )    {        // This code causes a fake interrupt.        asm volatile (            "xor    $24,$24,$24;"            "mtc0   $24,$13;"            "lui    $25,%%hi(1f);"            "ori    $25,$25,%%lo(1f);"            "j      other_vector;"            "nop;"            "1:"            :            :            : "t8", "t9"            );    }#endif#if 0 //def CYGPKG_HAL_MIPS_TX39_JMR3904    if( (count % 100000 ) == 0 )    {//        cyg_uint32 tval, isr, imr, ilr;          cyg_uint32 sr = 0, cr = 0, ctr = 0, cpr = 0;//        HAL_CLOCK_READ( &tval );//        HAL_READ_UINT32( 0xFFFFC000, isr );//        HAL_READ_UINT32( 0xFFFFC004, imr );//        HAL_READ_UINT32( 0xFFFFC01C, ilr );//        CYG_TRACE2(1, "Timer value, ISR ",tval, isr);//        CYG_TRACE2(1, "IMR ILR0 ", imr, ilr);//        asm volatile (//            "mfc0  %0,$12;"//            "nop; nop; nop;"//            "mfc0  %1,$13;"//            "nop; nop; nop;"//            "mfc0  %2,$9;"//            "nop; nop; nop;"//            "mfc0  %3,$11;"//            "nop; nop; nop;"//            : "=r"(sr), "=r"(cr), "=r"(ctr), "=r"(cpr)//            );        //        diag_printf("Status %08x ", sr );//       diag_printf("Cause %08x ", cr );//        diag_printf("Counter %08x ", ctr );//        diag_printf("Compare %08x\n", cpr);#if 0        asm volatile (            "mfc0  %0,$12;"            "nop; nop; nop;"            : "=r"(sr)            );        diag_write_string("Status "); diag_write_hex( sr );        asm volatile (            "mfc0  %0,$13;"            "nop; nop; nop;"            : "=r"(cr)            );        diag_write_string(" Cause "); diag_write_hex( cr );        asm volatile (            "mfc0  %0,$9;"            "nop; nop; nop;"            : "=r"(ctr)            );        diag_write_string(" Counter "); diag_write_hex( ctr );        asm volatile (            "mfc0  %0,$11;"            "nop; nop; nop;"            : "=r"(cpr)            );        diag_write_string(" Compare "); diag_write_hex( cpr );        diag_write_string( "\n" );        #endif#if 1                 asm volatile (            "mfc0  %0,$12;"            "nop; nop; nop;"            : "=r"(sr)            );        asm volatile (            "mfc0  %0,$13;"            "nop; nop; nop;"            : "=r"(cr)            );        CYG_INSTRUMENT_USER( 1, sr, cr );        asm volatile (            "mfc0  %0,$9;"            "nop; nop; nop;"            : "=r"(ctr)            );        asm volatile (            "mfc0  %0,$11;"            "nop; nop; nop;"            : "=r"(cpr)            );                CYG_INSTRUMENT_USER( 2, ctr, cpr );#endif        //        if( count == 4 )//        {//            HAL_ENABLE_INTERRUPTS();//        }        //        if( count >= 10 )//            for(;;);    }#endif#if 0    {        static CYG_WORD32 istat[3] = { 0xffffffff,0xffffffff,0xffffffff };        int i;        for( i = 0; i < 3; i++ )        {            CYG_WORD32 reg, sr;            HAL_READ_UINT32( CYGHWR_HAL_MIPS_VRC4373_INTC_STAT0 + i * CYGHWR_HAL_MIPS_VRC4373_INTC_MASK_OFF, reg );            if( reg != istat[i] )            {                hal_diag_ai_write_char('~');                hal_diag_ai_write_char('0'+i);                hal_diag_ai_write_hex8( reg );                istat[i] = reg;                HAL_READ_UINT32( CYGHWR_HAL_MIPS_VRC4373_INTC_MASK0 + i * CYGHWR_HAL_MIPS_VRC4373_INTC_MASK_OFF, reg );                hal_diag_ai_write_char('.');                                hal_diag_ai_write_hex8( reg );#if 0                                asm volatile (                    "mfc0  %0,$12;"                    "nop; nop; nop;"                    : "=r"(sr)                    );                hal_diag_ai_write_char('.');                                hal_diag_ai_write_hex8( sr );#endif            }        }    }    {        static CYG_WORD32 old_pins = 0;        CYG_WORD32 reg;                HAL_READ_UINT32( CYGHWR_HAL_MIPS_VRC4373_INTC_PINS, reg );        if( reg != old_pins )        {            hal_diag_ai_write_char('%');                            hal_diag_ai_write_hex8( reg );            old_pins = reg;        }    }#endif#if 0 //def CYGPKG_HAL_MIPS_VR4300_VRC4373    // Wiggle one of the leds to show we are running        if( (count % 50000 ) == 0 )    {        cyg_uint8 lr;        { int i; for( i = 0; i < 200; i++ ); }        HAL_READ_UINT8( 0xc2000008, lr );        lr ^= 2;        { int i; for( i = 0; i < 200; i++ ); }        HAL_WRITE_UINT8( 0xc2000008, lr );    }#endif    }/*------------------------------------------------------------------------*//* End of hal_misc.c                                                      */

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?