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 + -
显示快捷键?