12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445 |
- #include <sys/time.h>
- #include <time.h>
- #include "rtos_lib.h"
- #include "gd_timer.h"
- #include "gm_debug.h"
- #include "rtthread.h"
- #include "shell.h"
- #ifdef RT_USING_FINSH
- #include "shell.h"
- #endif
- //#define CACHE_MEM_MANAGE
- #define CACHE_MEM_SIZE 0x200000//1152k
- #define CACHE_DSP_SIZE 0x330000//3168k
- #define CACHE_LINE_SIZE 32
- #define CACHE_LINE_MASK ~(CACHE_LINE_SIZE - 1)
- static int cache_check_end = 0;
- static int cache_check_start = 1;
- //static int cache_check_fail_halt = 0;
- void RTOS_MMU_ChangeMapEntry(U32 vaddrStart, U32 vaddrEnd, U32 paddrStart, U32 attr);
- static inline void __delay(int loops);
- u32 cpu_cpsr;
- #define HZ RT_TICK_PER_SECOND
- #define LPS_PREC 8
- #define jiffies raid6_jiffies()
- static inline void __delay(int loops)
- {
- return;
- }
- static inline unsigned int raid6_jiffies(void)
- {
- //struct timeval tv;
- //gettimeofday(&tv, NULL);
- //return tv.tv_sec*1000 + tv.tv_usec/1000;
- return rt_tick_get()*1000;
- }
- static unsigned long calibrate_delay_converge(void)
- {
- /* First stage - slowly accelerate to find initial bounds */
- unsigned long lpj, lpj_base, ticks, loopadd, loopadd_base, chop_limit;
- int trials = 0, band = 0, trial_in_band = 0;
- lpj = (1<<12);
- /* wait for "start of" clock tick */
- ticks = jiffies;
- while (ticks == jiffies)
- ; /* nothing */
- /* Go .. */
- ticks = jiffies;
- do {
- if (++trial_in_band == (1<<band)) {
- ++band;
- trial_in_band = 0;
- }
- __delay(lpj * band);
- trials += band;
- } while (ticks == jiffies);
- /*
- * We overshot, so retreat to a clear underestimate. Then estimate
- * the largest likely undershoot. This defines our chop bounds.
- */
- trials -= band;
- loopadd_base = lpj * band;
- lpj_base = lpj * trials;
- recalibrate:
- lpj = lpj_base;
- loopadd = loopadd_base;
- /*
- * Do a binary approximation to get lpj set to
- * equal one clock (up to LPS_PREC bits)
- */
- chop_limit = lpj >> LPS_PREC;
- while (loopadd > chop_limit) {
- lpj += loopadd;
- ticks = jiffies;
- while (ticks == jiffies)
- ; /* nothing */
- ticks = jiffies;
- __delay(lpj);
- if (jiffies != ticks) /* longer than 1 tick */
- lpj -= loopadd;
- loopadd >>= 1;
- }
- /*
- * If we incremented every single time possible, presume we've
- * massively underestimated initially, and retry with a higher
- * start, and larger range. (Only seen on x86_64, due to SMIs)
- */
- if (lpj + loopadd * 2 == lpj_base + loopadd_base * 2) {
- lpj_base = lpj;
- loopadd_base <<= 2;
- goto recalibrate;
- }
- return lpj;
- }
- void RTOS_Jiffies()
- {
- unsigned long lpj;
- lpj = calibrate_delay_converge();
- rt_kprintf("Calibrating delay loop... %lu.%02lu BogoMIPS (lpj=%lu)\n",
- lpj/(500000/HZ),
- (lpj/(5000/HZ)) % 100, lpj);
- }
- void gk7101_setting_pll()
- {
- int i = 0;
- *((volatile U32 *)0x70170000) = 0x01202e01;
- *((volatile U32 *)0x70170004) = 0x00000000;
- *((volatile U32 *)0x7017000C) = 0x0000000c;
- *((volatile U32 *)0x70170014) = 0x01202401;
- *((volatile U32 *)0x70170018) = 0x00000000;
- *((volatile U32 *)0x7017001C) = 0x00000001;
- *((volatile U32 *)0x70170024) = 0x02406301;
- *((volatile U32 *)0x70170028) = 0x00000000;
- *((volatile U32 *)0x70170030) = 0x00000000;
- *((volatile U32 *)0x70170034) = 0x00000000;
- *((volatile U32 *)0x70170038) = 0x00000001;
- *((volatile U32 *)0x7017003C) = 0x00000008;
- *((volatile U32 *)0x7017004C) = 0x00000001;
- *((volatile U32 *)0x70170050) = 0x00000001;
- *((volatile U32 *)0x70170054) = 0x01202001;
- *((volatile U32 *)0x70170058) = 0x00c49ba5;
- *((volatile U32 *)0x7017005C) = 0x00000008;
- *((volatile U32 *)0x70170060) = 0x00000001;
- *((volatile U32 *)0x70170068) = 0x00000002;
- *((volatile U32 *)0x70170080) = 0x00206978;
- *((volatile U32 *)0x70170084) = 0x00000020;
- *((volatile U32 *)0x7017008C) = 0x0000000f;
- *((volatile U32 *)0x7017009C) = 0x00000002;
- *((volatile U32 *)0x701700A0) = 0x00000010;
- *((volatile U32 *)0x701700BC) = 0x00000001;
- *((volatile U32 *)0x701700E4) = 0x01203201;
- *((volatile U32 *)0x701700E8) = 0x00000000;
- *((volatile U32 *)0x701700EC) = 0x00000008;
- *((volatile U32 *)0x70170100) = 0x00000030;
- *((volatile U32 *)0x70170108) = 0x00000030;
- *((volatile U32 *)0x70170118) = 0x00000002;
- *((volatile U32 *)0x7017011C) = 0x00000030;
- *((volatile U32 *)0x70170124) = 0x00000030;
- *((volatile U32 *)0x70170130) = 0x00000030;
- *((volatile U32 *)0x70170148) = 0x00000001;
- *((volatile U32 *)0x70170198) = 0x00000000;
- *((volatile U32 *)0x7017019C) = 0x00000000;
- *((volatile U32 *)0x701701E0) = 0x00000000;
- *((volatile U32 *)0x701701E4) = 0x00000000;
- *((volatile U32 *)0x701701F4) = 0x00000002;
- *((volatile U32 *)0x701701FC) = 0x00000021;
- *((volatile U32 *)0x70170200) = 0x00000022;
- *((volatile U32 *)0x70170214) = 0x00000022;
- #if 0
- *((volatile U32 *)0x7017021C) = 0x00000000;
- *((volatile U32 *)0x70170228) = 0x00000000;
- *((volatile U32 *)0x7017022C) = 0x00000000;
- #endif
- for(i=0; i<14; i++)
- {
- *((volatile U32 *)((U32)0x70170230 + i*4)) = 0x11111111;
- }
- #if 0
- *((volatile U32 *)0x70170270) = 0x00000000;
- #endif
- *(volatile U32 *)(0x70009100+20*4) = (1<<8);
- *(volatile U32 *)(0x70009200+7*4) = 20;
- *(volatile U32 *)(0x70009100+22*4) = 9;
- }
- //-------------------------------------------------------
- #if 0
- rt_inline unsigned int rt_list_len(const rt_list_t *l)
- {
- unsigned int len = 0;
- const rt_list_t *p = l;
- while (p->next != l)
- {
- p = p->next;
- len ++;
- }
- return len;
- }
- #endif
- static void show_wait_queue(struct rt_list_node *list)
- {
- struct rt_thread *thread;
- struct rt_list_node *node;
- for (node = list->next; node != list; node = node->next)
- {
- thread = rt_list_entry(node, struct rt_thread, tlist);
- rt_kprintf("%s", thread->name);
- if (node->next != list)
- rt_kprintf("/");
- }
- }
- void rtos_cache_inv_range(void *addr, unsigned int size)
- {
- u32 vstart;
- u32 vend;
- u32 addr_tmp;
- vstart = (u32)addr & CACHE_LINE_MASK;
- vend = ((u32)addr + size + CACHE_LINE_SIZE - 1) & CACHE_LINE_MASK;
- if (cache_check_start && (vstart != (u32)addr)) {
- return;
- }
- if (cache_check_end && (vend != ((u32)addr + size))) {
- return;
- }
- for (addr_tmp = vstart; addr_tmp < vend; addr_tmp += CACHE_LINE_SIZE) {
- __asm__ __volatile__ (
- "mcr p15, 0, %0, c7, c6, 1" : : "r" (addr_tmp));
- }
- dsb();
- }
- void rtos_cache_clean_range(void *addr, unsigned int size)
- {
- u32 vstart;
- u32 vend;
- u32 addr_tmp;
- vstart = (u32)addr & CACHE_LINE_MASK;
- vend = ((u32)addr + size + CACHE_LINE_SIZE - 1) & CACHE_LINE_MASK;
- if (cache_check_start && (vstart != (u32)addr)) {
- return;
- }
- if (cache_check_end && (vend != ((u32)addr + size))) {
- return;
- }
- for (addr_tmp = vstart; addr_tmp < vend; addr_tmp += CACHE_LINE_SIZE) {
- __asm__ __volatile__ (
- "mcr p15, 0, %0, c7, c10, 1" : : "r" (addr_tmp));
- }
- dsb();
- }
- U32 RTOS_EnterCriticalSection( void )
- {
- #if 0
- /*lint -save -e529 */
- U32 old_flags = 0;
- U32 new_flags = 0;
- #if defined(_ARM) && !defined(__GNUC__) && !defined(__polyspace__)
- __asm { mrs old_flags,cpsr }
- __asm { orr new_flags,old_flags,#0xC0 }
- __asm { msr cpsr_c,new_flags }
- #endif
- #if defined(_ARM) && defined(__GNUC__) && !defined(__polyspace__)
- asm volatile( "mrs %0,cpsr" : "=r"(old_flags) : "r"(new_flags) );
- asm volatile( "orr %0,%1,#0xC0" : "=r"(new_flags) : "r"(old_flags) );
- asm volatile( "msr cpsr_c,%0" : : "r"(new_flags) );
- #endif
- #if defined(_ARC) && !defined(__polyspace__)
- old_flags = _lr(0);
- _flag(0);
- #endif
- return( old_flags );
- #else
- return (U32)rt_hw_interrupt_disable();
- #endif
- /*lint -restore */
- }
- void RTOS_LeaveCriticalSection( U32 cpuStatus )
- {
- #if 0
- /*lint -save -e715 */
- #if defined(_ARM) && !defined(__GNUC__) && !defined(__polyspace__)
- __asm { msr cpsr_c,cpuStatus }
- #endif
- #if defined(_ARM) && defined(__GNUC__) && !defined(__polyspace__)
- asm volatile ( "msr cpsr_c,%0" : : "r"(cpuStatus) );
- #endif
- #if defined(_ARC) && !defined(__polyspace__)
- cpuStatus &= 0x0C000000;
- _flag( cpuStatus >> 25 );
- #endif
- #else
- rt_hw_interrupt_enable(cpuStatus);
- #endif
- /*lint -restore */
- }
- void RTOS_Halt( void )
- {
- RTOS_EnterCriticalSection();
- }
- //-------------------------------------------------------------
- RTOS_Memory RTOS_MemorySet( RTOS_Memory mem, U8 value, RTOS_Size bytes )
- {
- if( ( mem == (RTOS_Memory)0 ) || ( bytes == 0 ) )
- return( (RTOS_Memory)0 );
- #if 0
- return rt_memset(mem,value,bytes);
- #else// use libc 's memset to improve performance.
- return memset(mem,value,bytes);
- #endif
- }
- RTOS_Memory RTOS_Malloc( RTOS_Size bytes)
- {
- return rt_malloc(bytes);
- }
- RTOS_Memory RTOS_Realloc( RTOS_Memory addr, RTOS_Size bytes )
- {
- return rt_realloc(addr, bytes);
- }
- char * RTOS_ThreadGetSelfName(void);
- RTOS_Memory RTOS_MemoryAllocate( RTOS_Size bytes, RTOS_Flag shared )
- {
- //if (bytes >= 0x10000)
- // printf("RTOS_MemoryAllocate: %d(%s)\n",bytes, RTOS_ThreadGetSelfName());
- return rt_malloc(bytes);
- }
- RTOS_Status RTOS_MemoryRelease( RTOS_Memory memory )
- {
- if(memory) rt_free(memory);
- return 0;
- }
- RTOS_Memory RTOS_SysMemoryAllocate( RTOS_Size bytes, RTOS_Flag shared )
- {
- #ifndef CACHE_MEM_MANAGE
- return (RTOS_Memory)rt_malloc(bytes);
- #else
- return (RTOS_Memory)rt_dspmem_malloc(bytes);
- #endif
- }
- RTOS_Status RTOS_SysMemoryRelease( RTOS_Memory memory )
- {
- if(memory)
- #ifndef CACHE_MEM_MANAGE
- rt_free(memory);
- #else
- rt_dspmem_free(memory);
- #endif
- return 0;
- }
- RTOS_Memory RTOS_KernelMemoryAllocate( RTOS_Size bytes)
- {
- return (RTOS_Memory)RT_KERNEL_MALLOC(bytes);
- }
- RTOS_Status RTOS_KernelMemoryRelease( RTOS_Memory memory )
- {
- if(memory)
- RT_KERNEL_FREE(memory);
- return 0;
- }
- void RTOS_GetMemInfo( RTOS_Size *Cache_memory, RTOS_Size *Uncache_memory)
- {
- rt_uint32_t total,used,max_used;
- rt_memory_info(&total,&used,&max_used);
- *Cache_memory = total;
- *Uncache_memory = 0;
- #ifdef CACHE_MEM_MANAGE
- rt_cache_memory_info(&total,&used,&max_used);
- *Uncache_memory = total;
- #endif
- }
- void RTOS_HeapMemoryReport( void )
- {
- rt_uint32_t total,used,max_used;
- rt_memory_info(&total,&used,&max_used);
- rt_kprintf("Heap Memory Info [cache memory]\n");
- rt_kprintf("total memory: %d KBytes,%d Btyes\n", total/1024,total);
- rt_kprintf("used memory : %d KBytes,%d Btyes\n", used/1024,used);
- rt_kprintf("maximum allocated memory: %d KBytes,%d Btyes\n", max_used/1024,max_used);
- }
- void RTOS_SysMemoryReport( void )
- {
- #ifdef CACHE_MEM_MANAGE
- rt_uint32_t total,used,max_used;
- rt_cache_memory_info(&total,&used,&max_used);
- rt_kprintf("Sys Memory Info [cache memory]\n");
- rt_kprintf("total memory: %d KBytes\n", total/1024);
- rt_kprintf("used memory : %d KBytes\n", used/1024);
- rt_kprintf("maximum allocated memory: %d KBytes\n", max_used/1024);
- rt_dspmem_memory_info(&total,&used,&max_used);
- rt_kprintf("Drv Memory Info [uncache memory]\n");
- rt_kprintf("total memory: %d KBytes\n", total/1024);
- rt_kprintf("used memory : %d KBytes\n", used/1024);
- rt_kprintf("maximum allocated memory: %d KBytes\n", max_used/1024);
- #endif
- }
- RTOS_Memory RTOS_MemoryCopy( RTOS_Memory dst, RTOS_Memory src, RTOS_Size bytes )
- {
- #if 0
- U8* dstArray = (U8*)dst;
- U8* srcArray = (U8*)src;
- RTOS_Size index;
- if( ( dst == (RTOS_Memory)0 ) || ( bytes == 0 ) )
- return( (RTOS_Memory)0 );
- for( index=0; index < bytes; index++ )
- dstArray[index] = srcArray[index];
- return( dst );
- #else// use libc 's memcpy to improve performance.
- if( ( dst == (RTOS_Memory)0 ) || ( bytes == 0 ) )
- return( (RTOS_Memory)0 );
- memcpy(dst, src, bytes);
- return( dst );
- #endif
- }
- //-------------------------------------------------------------
- U32 RTOS_SetThreadName( RTOS_ThreadT threadHandle, const char* optName)
- {
- rt_base_t level;
- level = rt_hw_interrupt_disable();
- if(threadHandle)
- {
- rt_strncpy(((rt_thread_t)threadHandle)->name, optName, RT_NAME_MAX);
- }
- rt_hw_interrupt_enable(level);
- return 0;
- }
- U32 RTOS_ThreadSetName( RTOS_ThreadT threadHandle, const char* optName)
- {
- rt_base_t level;
- level = rt_hw_interrupt_disable();
- if(threadHandle)
- {
- rt_strncpy(((rt_thread_t)threadHandle)->name, optName, RT_NAME_MAX);
- }
- rt_hw_interrupt_enable(level);
- return 0;
- }
- char * RTOS_ThreadGetSelfName(void)
- {
- return rt_thread_self()->name;
- }
- // thread-safe errno related api functions.
- void RTOS_SetErrno(const int err)
- {
- #if 0
- rt_base_t level;
- level = rt_hw_interrupt_disable();
- rt_thread_t self = rt_thread_self();
- self->thr_internal_errno = err;//FIXME(heyong): error is used to errno.
- rt_hw_interrupt_enable(level);
- //rt_kprintf("RTOS_SetErrno %d\n", err);
- #endif
- }
- int RTOS_GetErrno()
- {
- int err;
- #if 0
- rt_base_t level;
- level = rt_hw_interrupt_disable();
- rt_thread_t self = rt_thread_self();
- err = (int)self->thr_internal_errno;//FIXME(heyong): error is used to errno.
- rt_hw_interrupt_enable(level);
- //rt_kprintf("RTOS_GetErrno %d\n", err);
- #endif
- return err;
- }
- RTOS_ThreadT RTOS_CreateThread(
- U32* stackBuffer, U32 stackSize, U32 priority,
- RTOS_ThreadFunctionT function, void* optArg, void* optData,
- const char* optName )
- {
- rt_thread_t tid;
- if (priority < RTOS_ThreadPriorityHighest)
- {
- priority = RTOS_ThreadPriorityHighest - priority;
- }
- else
- {
- priority = 1;
- }
- tid = rt_thread_create((optName == NULL)?"thread":optName,
- function, optArg,
- stackSize, priority, THREAD_TIMESLICE);
- if (tid != RT_NULL)
- {
- rt_thread_startup(tid);
- }
- return (RTOS_ThreadT)tid;
- }
- U32 RTOS_DestroyThread( RTOS_ThreadT threadHandle )
- {
- rt_err_t ret = 0;
- rt_enter_critical();
- ret = rt_thread_delete((rt_thread_t)threadHandle);
- rt_exit_critical();
- if (RT_EOK == ret)
- {
- ret = 1;
- }
- else
- {
- ret = 0;
- }
- return ret;
- }
- U32 RTOS_ThreadDestroy( RTOS_ThreadT threadHandle )
- {
- rt_err_t ret = 0;
- rt_enter_critical();
- ret = rt_thread_delete((rt_thread_t)threadHandle);
- rt_exit_critical();
- if (RT_EOK == ret)
- {
- ret = 1;
- }
- else
- {
- ret = 0;
- }
- return ret;
- }
- U32 RTOS_GetThreadPriority(RTOS_ThreadT threadHandle)
- {
- rt_thread_t tid = (rt_thread_t)threadHandle;
- int priority = tid->current_priority;
- if (priority < RTOS_ThreadPriorityHighest)
- {
- priority = RTOS_ThreadPriorityHighest - priority;
- }
- else
- {
- priority = 1;
- }
- return priority;
- }
- void gkosFinishThread( void )
- {
- //rt_thread_t t = rt_thread_self();
- //rt_thread_detach(t);
- }
- void RTOS_LockScheduler( void )
- {
- rt_enter_critical();
- }
- void RTOS_UnlockScheduler( void )
- {
- rt_exit_critical();
- }
- void RTOS_SchedulerLock( void )
- {
- rt_enter_critical();
- }
- void RTOS_SchedulerUnlock( void )
- {
- rt_exit_critical();
- }
- U32 RTOS_SleepThread( U32 msecs )
- {
- return rt_thread_delay( msecs ) ;
- }
- U32 msleep( U32 msecs )
- {
- return rt_thread_delay( msecs ) ;
- }
- U32 RTOS_SuspendThread( RTOS_ThreadT threadHandle )
- {
- return rt_thread_suspend((rt_thread_t)threadHandle);
- }
- U32 RTOS_WakeupThread( RTOS_ThreadT threadHandle )
- {
- return rt_thread_resume( (rt_thread_t)threadHandle );
- }
- void thread_statistics()
- {
- struct rt_thread *thread;
- struct rt_list_node *node;
- rt_uint8_t *ptr;
- rt_base_t level;
- struct rt_object_information *information;
- information = rt_object_get_information(RT_Object_Class_Thread);
- RT_ASSERT(information != RT_NULL);
- struct rt_list_node *list = &(information->object_list);
- level = rt_hw_interrupt_disable();
- for (node = list->next; node != list; node = node->next)
- {
- thread = rt_list_entry(node, struct rt_thread, list);
- //if(thread) thread->total_tick = 0;
- }
- rt_hw_interrupt_enable(level);
- rt_thread_delay(5000);
- //not close interrupt to avoid the venc error because the print time is too long.
- //level = rt_hw_interrupt_disable();
- rt_kprintf(" thread pri status tick cpu%% sp stack addr stack size max used left tick\n");
- rt_kprintf("-------------------------------- --- ------- ------ ------- ---------- ---------- ---------- ---------- ---------- \n");
- for (node = list->next; node != list; node = node->next)
- {
- thread = rt_list_entry(node, struct rt_thread, list);
- #if 0
- rt_kprintf("%-32.*s 0x%02x", RT_NAME_MAX, thread->name, thread->current_priority);
- #else
- int priority = thread->current_priority;
- if (priority < RTOS_ThreadPriorityHighest)
- {
- priority = RTOS_ThreadPriorityHighest - priority;
- }
- else
- {
- priority = 1;
- }
- rt_kprintf("%-32.*s %3d", RT_NAME_MAX, thread->name, priority);
- #endif
- if (thread->stat == RT_THREAD_READY) rt_kprintf(" ready");
- else if (thread->stat == RT_THREAD_SUSPEND) rt_kprintf(" suspend");
- else if (thread->stat == RT_THREAD_INIT) rt_kprintf(" init");
- else if (thread->stat == RT_THREAD_CLOSE) rt_kprintf(" close");
- ptr = (rt_uint8_t*)thread->stack_addr;
- while (*ptr == '#')ptr ++;
- #if 0
- rt_kprintf(" %5d %5.2f%% 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x \n",
- thread->total_tick,
- ((double)thread->total_tick/50)>=100.00?99.9:((double)thread->total_tick/50),
- thread->stack_size + ((rt_uint32_t)thread->stack_addr - (rt_uint32_t)thread->sp),
- thread->stack_addr,
- thread->stack_size,
- thread->stack_size - ((rt_uint32_t) ptr - (rt_uint32_t)thread->stack_addr),
- thread->remaining_tick);
- #endif
- rt_kprintf(" 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x \n",
- thread->stack_size + ((rt_uint32_t)thread->stack_addr - (rt_uint32_t)thread->sp),
- thread->stack_addr,
- thread->stack_size,
- thread->stack_size - ((rt_uint32_t) ptr - (rt_uint32_t)thread->stack_addr),
- thread->remaining_tick);
- }
- //rt_hw_interrupt_enable(level);
- }
- void RTOS_ThreadDisplayStatistics( void )
- {
- rt_uint32_t total;
- rt_uint32_t used;
- rt_uint32_t max_used;
- rt_memory_info(&total,&used,&max_used);
- rt_kprintf("\n memory info size \n");
- rt_kprintf("--------------------------------- -------\n");
- rt_kprintf("total heap memory : %d(%dKB)\n", total, total/1024);
- rt_kprintf("used heap memory : %d(%dKB)\n", used, used/1024);
- rt_kprintf("maximum allocated heap memory: %d(%dKB)\n\n", max_used, max_used/1024);
- #ifdef CACHE_MEM_MANAGE
- rt_cache_memory_info(&total,&used,&max_used);
- rt_kprintf("total sys memory : %d(%dKB)\n", total, total/1024);
- rt_kprintf("used sys memory : %d(%dKB)\n", used, used/1024);
- rt_kprintf("maximum allocated sys memory: %d(%dKB)\n", max_used, max_used/1024);
- rt_dspmem_memory_info(&total,&used,&max_used);
- rt_kprintf("total drv memory : %d(%dKB)\n", total, total/1024);
- rt_kprintf("used drv memory : %d(%dKB)\n", used, used/1024);
- rt_kprintf("maximum allocated drv memory: %d(%dKB)\n", max_used, max_used/1024);
- #endif
- thread_statistics();
- return ;
- }
- U32 RTOS_GetFreeHeapSize()
- {
- rt_uint32_t total;
- rt_uint32_t used;
- rt_uint32_t max_used;
- rt_memory_info(&total,&used,&max_used);
- return (total-used);
- }
- RTOS_Time RTOS_KernelTimerGetPeriod(void)
- {
- return (1000 / RT_TICK_PER_SECOND);
- }
- //-------------------------sem--------------------------
- RTOS_SemaphoreT RTOS_CreateSemaphore( U32 initCount )
- {
- return (RTOS_SemaphoreT)rt_sem_create("sem", initCount, RT_IPC_FLAG_PRIO);
- }
- U32 RTOS_WaitSemaphore(RTOS_SemaphoreT semaphoreHandle, U32 suspend)
- {
- if(suspend)
- return RTOS_GetSemaphore((RTOS_Semaphore)semaphoreHandle, RTOS_SUSPEND);
- else
- return RTOS_GetSemaphore((RTOS_Semaphore)semaphoreHandle, RTOS_NO_SUSPEND);
- }
- U32 RTOS_GetSemaphore( RTOS_SemaphoreT semaphoreHandle,
- U32 msecsTimeout )
- {
- return rt_sem_take((rt_sem_t)semaphoreHandle, msecsTimeout);
- }
- U32 RTOS_SetSemaphore( RTOS_SemaphoreT semaphoreHandle,
- U32 msecsTimeout )
- {
- return rt_sem_release((rt_sem_t)semaphoreHandle);
- }
- RTOS_Status RTOS_SemaphoreDestroy( RTOS_Semaphore semaphoreHandle )
- {
- return rt_sem_delete((rt_sem_t)semaphoreHandle);
- }
- RTOS_Status RTOS_DestroySemaphore( RTOS_Semaphore semaphoreHandle )
- {
- return rt_sem_delete((rt_sem_t)semaphoreHandle);
- }
- S32 RTOS_SemaphoreQuery( RTOS_Semaphore semaphoreHandle )
- {
- S32 countPtr = 0;
- rt_ubase_t level;
- level = rt_hw_interrupt_disable();
- countPtr = ((rt_sem_t)semaphoreHandle)->value;
- rt_hw_interrupt_enable(level);
- return (S32)countPtr;
- }
- //-------------------------timer-------------------------
- void GKOS_KernelTimerSetHook(RTOS_HookFunction function)
- {
- if(gkosHookData)
- {
- if(gkosHookData->timerFunctionCount < (GKOS_TIMER_HOOK_TABLE_SIZE - 1))
- {
- gkosHookData->timerFunctionArray[gkosHookData->timerFunctionCount] = function;
- gkosHookData->timerFunctionCount ++;
- }
- }
- }
- void RTOS_KernelTimerSetHook(RTOS_HookFunction function)
- {
- GKOS_KernelTimerSetHook(function);
- }
- //-------------------------mail queue-------------------------
- #if 0
- RTOS_MailqueueT RTOS_MailqueueCreate( U32 queueElements)
- {
- struct rt_mailbox *mq;
- mq = rt_mb_create("mqt", queueElements, RT_IPC_FLAG_FIFO);
- return (RTOS_MailqueueT)mq;
- }
- #endif
- RTOS_MailqueueT RTOS_CreateMailqueue( U32 queueElements, U32 elementBytes )
- {
- struct rt_mailbox *mq;
- mq = rt_mb_create("mqt", queueElements, RT_IPC_FLAG_FIFO);
- return (RTOS_MailqueueT)mq;
- }
- RTOS_Status RTOS_MailqueueSend(RTOS_Mailqueue mailqueue, RTOS_Message data)
- {
- //rt_kprintf("mail send...0x%x\n", data);
- return rt_mb_send((rt_mailbox_t)mailqueue, (rt_uint32_t)data);
- }
- RTOS_Status RTOS_MailqueueSendTimeout(RTOS_Mailqueue mailqueue, RTOS_Message data, RTOS_Time timeout)
- {
- //rt_kprintf("mail send...0x%x\n", data);
- return rt_mb_send_wait((rt_mailbox_t)mailqueue, (rt_uint32_t)data, timeout);
- }
- RTOS_Message RTOS_MailqueueWait(RTOS_Mailqueue mailqueue, RTOS_Flag suspend)
- {
- int ret;
- U32 timeout;
- U8* messagePtr;
- if( suspend )
- timeout = RTOS_SUSPEND;
- else
- timeout = RTOS_NO_SUSPEND;
- ret = rt_mb_recv((rt_mailbox_t)mailqueue, (void*)(&messagePtr), timeout);
- //rt_kprintf("mail recv [0x%x]...0x%x\n", (U32)timeout, messagePtr);
- if(ret != 0)
- return NULL;
- return (RTOS_Message)messagePtr;
- }
- RTOS_Message RTOS_MailqueueWaitTimeout( RTOS_Mailqueue mailqueue, RTOS_Time timeout )
- {
- U8* messagePtr;
- int ret;
- ret = rt_mb_recv((rt_mailbox_t)mailqueue, (void*)(&messagePtr), timeout);
- //rt_kprintf("mail recv [0x%x]...0x%x\n", (U32)timeout, messagePtr);
- if(ret != 0)
- return NULL;
- return (RTOS_Message)messagePtr;
- }
- U32 RTOS_MailqueueDestroy( RTOS_MailqueueT mailqueuePtr )
- {
- rt_mb_delete((rt_mailbox_t)mailqueuePtr);
- return 0;
- }
- U32 RTOS_DestroyMailqueue( RTOS_MailqueueT mailqueuePtr )
- {
- rt_mb_delete((rt_mailbox_t)mailqueuePtr);
- return 0;
- }
- U32 RTOS_GetTimerStamp()
- {
- return rt_tick_get();
- }
- /*
- *******************************************************************************
- **
- ** Create a new mutex and initializes it with the given value.
- **
- *******************************************************************************
- */
- RTOS_MutexT RTOS_MutexCreate( void )
- {
- return( (RTOS_MutexT) rt_mutex_create("mutex", RT_IPC_FLAG_FIFO) );
- }
- /*
- *******************************************************************************
- **
- ** Destroy a given mutex.
- **
- *******************************************************************************
- */
- U32 RTOS_MutexDestroy( RTOS_MutexT mutex )
- {
- return rt_mutex_delete( (rt_mutex_t) mutex );
- }
- /*
- *******************************************************************************
- **
- ** Query (read) the current value from a given mutex.
- **
- *******************************************************************************
- */
- S32 RTOS_MutexQuery( RTOS_MutexT mutex )
- {
- S32 countPtr = 0;
- rt_ubase_t level;
- level = rt_hw_interrupt_disable();
- countPtr = ((rt_mutex_t)mutex)->value;
- rt_hw_interrupt_enable(level);
- return countPtr;
- }
- /*
- *******************************************************************************
- **
- ** Wait and lock a given mutex
- **
- *******************************************************************************
- */
- U32 RTOS_MutexLock( RTOS_MutexT mutex, RTOS_Flag suspend )
- {
- U32 timeout;
- if( suspend )
- timeout = RTOS_SUSPEND;
- else
- timeout = RTOS_NO_SUSPEND;
- return rt_mutex_take( (rt_mutex_t) mutex, timeout );
- }
- U32 RTOS_MutexLockTimeout( RTOS_MutexT mutex, U32 timeout )
- {
- return rt_mutex_take( (rt_mutex_t) mutex, timeout );
- }
- /*
- *******************************************************************************
- **
- ** Unlock an occupied mutex
- **
- *******************************************************************************
- */
- U32 RTOS_MutexUnlock( RTOS_MutexT mutex )
- {
- return rt_mutex_release( (rt_mutex_t) mutex );
- }
- //--------------------------------------------------------
- RTOS_ThreadT RTOS_ThreadSelf( void )
- {
- return( (RTOS_ThreadT)rt_thread_self() );
- }
- //-------------------------------------------------------
- extern unsigned char __heap_end__[];
- gkosHookDataT HookData;
- void RTOS_HwTickInit(void)
- {
- GD_HANDLE timerHandle;
- GBOOL timerFlag;
- GERR result;
- GD_INT_DisableAllInterrupts();
- // only use the os's timers
- // RTOS_TIMERTICK_IRQ must use the GD_INT_LOW_PRIORITY mode
- GD_INT_SetVector( GD_INT_TIMER1_IRQ, NULL );
- result = GD_TIMER_SoftTimerOpen( &timerHandle );
- if( result == GD_OK )
- {
- // modify the hard timer to Timer Tick
- result = GD_TIMER_SoftTimerSet( &timerHandle, 1, &timerFlag, NULL );
- GD_INT_SetVector( GD_INT_TIMER1_IRQ, rt_tick_increase );
- }
- int bytes = sizeof(gkosHookDataT);
- gkosHookData = &HookData;
- memset( gkosHookData, 0, bytes );
- }
- extern u32 ARM1176_MMU_ttb0[4096];
- U32 RTOS_InitKernel(U32 Heap_size)
- {
- u32 os_end_address=0;
- /* disable interrupt first */
- rt_hw_interrupt_disable();
- /* enable cpu cache */
- //rt_hw_cpu_icache_disable();
- //mmu_invalidate_icache();
- //rt_hw_cpu_icache_enable();
- /* initialize hardware interrupt */
- rt_hw_interrupt_init();
- /* initialize board */
- //rt_hw_board_init();
- /* show version */
- //rt_show_version();
- RTOS_HwTickInit();
- //rt_kprintf("set tick\n");
- /* initialize timer system */
- rt_system_timer_init();
- /* initialize heap memory system */
- os_end_address= (u32)__heap_end__+Heap_size;
- #ifdef CACHE_MEM_MANAGE
- rt_system_heap_init((void*)__heap_end__, (void*)(os_end_address-CACHE_MEM_SIZE-CACHE_DSP_SIZE));
- rt_system_cache_init((void*)(os_end_address-CACHE_MEM_SIZE-CACHE_DSP_SIZE),
- (void*)(os_end_address-CACHE_DSP_SIZE));
- //cache-buffer for system
- #if 0
- RTOS_MMU_ChangeMapEntry((U32)(os_end_address-CACHE_MEM_SIZE-CACHE_DSP_SIZE),(U32)os_end_address-CACHE_DSP_SIZE,
- (U32)(os_end_address-CACHE_MEM_SIZE), 0x00000DE2);
- #endif
- rt_system_dspmem_init((void*)(os_end_address-CACHE_DSP_SIZE), (void*)(os_end_address));
- //nocache nobuffer
- RTOS_MMU_ChangeMapEntry((U32)(os_end_address-CACHE_DSP_SIZE), (U32)os_end_address,
- (U32)(os_end_address-CACHE_DSP_SIZE), 0x00000DE2);
- /* print mmu table */
- //rt_hw_cpu_dump_page_table((rt_uint32_t*)ARM1176_MMU_ttb0);
- #else
- rt_system_heap_init((void*)__heap_end__, (void*)os_end_address);
- #endif
- #ifdef RT_USING_MODULE
- /* initialize module system*/
- rt_system_module_init();
- #endif
- /* initialize scheduler system */
- rt_system_scheduler_init();
- return 0;
- }
- void RTOS_StartMultitasking( void )
- {
- #ifdef RT_USING_FINSH
- /* initialize finsh */
- finsh_system_init();
- #ifdef RT_USING_DEVICE
- finsh_set_device(RT_CONSOLE_DEVICE_NAME);
- #endif
- #endif
- /* initialize system timer thread */
- rt_system_timer_thread_init();
- /* initialize idle thread */
- rt_thread_idle_init();
- rt_kprintf("start scheduler\n");
- /* start scheduler */
- rt_system_scheduler_start();
- /* never reach here */
- return ;
- }
- U32 RTOS_GetMailqueue( RTOS_MailqueueT mailqueueHandle,
- void* resultBuffer, U32 msecsTimeout )
- {
- return rt_mb_recv((rt_mailbox_t)mailqueueHandle,(rt_uint32_t*)resultBuffer,
- (rt_uint32_t)msecsTimeout);
- }
- U32 RTOS_SetMailqueue( RTOS_MailqueueT mailqueueHandle,
- void* messagePtr, U32 toFront,
- U32 msecsTimeout )
- {
- return rt_mb_send_wait((rt_mailbox_t)mailqueueHandle,
- (rt_uint32_t)messagePtr, (rt_uint32_t)msecsTimeout);
- }
- /*Dummy func of os*/
- //-----------------------------cond------------------------------
- RTOS_CondT RTOS_CondCreate( void )
- {
- rt_event_t evt;
- evt = rt_event_create("evt", 0);
- /* detach the object from system object container */
- rt_object_detach(&(evt->parent.parent));
- return (RTOS_CondT) evt;
- }
- RTOS_Status RTOS_CondDestroy( RTOS_CondT cond )
- {
- rt_err_t result;
- if (cond == RT_NULL)
- return -2;
- result = rt_event_delete((rt_event_t)cond);
- if (result != RT_EOK)
- return -3;
- return( 0 );
- }
- int _cond_timedwait(RTOS_CondT cond, RTOS_MutexT mutex, U32 timeout)
- {
- int result;
- rt_uint32_t recved = 0XFF;
- if (!cond || !mutex)
- return -1;
- if(RTOS_MutexUnlock(mutex)!=0) return -2;
- result = rt_event_recv((rt_event_t)cond, 0x01,RT_EVENT_FLAG_AND|RT_EVENT_FLAG_CLEAR,timeout,&recved);
- if(result == -RT_ERROR && recved == 0XFF) // for boardcase event
- {
- result = RT_EOK;
- }
- /* lock mutex again */
- RTOS_MutexLock(mutex, 1);
- return result;
- }
- RTOS_Status RTOS_CondWait( RTOS_CondT cond, RTOS_MutexT mutex, RTOS_Flag suspend )
- {
- S32 value = 0;
- U32 timeout;
- if( suspend )
- timeout = RTOS_SUSPEND;
- else
- timeout = RTOS_NO_SUSPEND;
- value = _cond_timedwait( (RTOS_CondT) cond, (RTOS_MutexT) mutex, timeout );
- if( value != RT_EOK )
- return( -1 );
- return( value );
- }
- RTOS_Status RTOS_CondWaitTimeout( RTOS_CondT cond, RTOS_MutexT mutex, U32 timeout )
- {
- S32 value = 0;
- value = _cond_timedwait( (RTOS_CondT) cond, (RTOS_MutexT) mutex, timeout );
- if( value != RT_EOK )
- return( -1 );
- return( value );
- }
- RTOS_Status RTOS_CondSignal( RTOS_CondT cond )
- {
- RTOS_Status result;
- result = rt_event_send((rt_event_t)cond,0x01);
- if (result != RT_EOK)
- return -1;
- return 0;
- }
- RTOS_Status RTOS_CondBroadcast( RTOS_CondT cond )
- {
- rt_event_control((rt_event_t)cond,RT_IPC_CMD_RESET,0);
- return 0;
- }
- U32 RTOS_OsType(void)
- {
- return RTOS_RTTHREAD;
- }
- void RTOS_MMU_ChangeMapEntry(U32 vaddrStart, U32 vaddrEnd, U32 paddrStart, U32 attr)
- {
- volatile U32 *pTT;
- volatile int i,nSec;
- extern U32 ARM1176_MMU_ttb0[];
- extern U32 ARM1176_MMU_ttb1[];
- U32* table_ptr = (U32*)ARM1176_MMU_ttb0;
- //printf("mmu table: 0x%x \n", (U32)ARM1176_MMU_ttb0);
- pTT = (U32 *)table_ptr + (vaddrStart>>20);
- nSec = (vaddrEnd>>20) - (vaddrStart>>20);
- //printf("change table: 0x%x -- %d\n", (U32)pTT, nSec);
- for(i=0;i<=nSec;i++)
- {
- *pTT = attr |(((paddrStart>>20)+i)<<20);
- pTT++;
- }
- table_ptr = (U32*)ARM1176_MMU_ttb1;
- //printf("mmu table: 0x%x \n", (U32)ARM1176_MMU_ttb1);
- pTT = (U32 *)table_ptr + (vaddrStart>>20);
- nSec = (vaddrEnd>>20) - (vaddrStart>>20);
- //printf("change table: 0x%x -- %d\n", (U32)pTT, nSec);
- for(i=0;i<=nSec;i++)
- {
- *pTT = attr |(((paddrStart>>20)+i)<<20);
- pTT++;
- }
- }
- int RTOS_thread_yield(void)
- {
- rt_thread_yield();
- return 0;
- }
- unsigned int RTOS_jiffies(void)
- {
- return jiffies;
- }
- RTOS_TimerT RTOS_CreateTimer(U32 isContinouos, RTOS_SemaphoreT fireSemaphore, RTOS_HookFunctionT callbackFunction)
- {
- //U8 name[32];
- //sprintf(name, "timer %X", (U32)callbackFunction);
- if(isContinouos)
- {
- return (RTOS_TimerT)rt_timer_create("timer", callbackFunction, NULL, 0, RT_TIMER_FLAG_PERIODIC);
- }
- else
- {
- return (RTOS_TimerT)rt_timer_create("timer", callbackFunction, NULL, 0, RT_TIMER_FLAG_ONE_SHOT);
- }
- }
- RTOS_TimerT RTOS_CreateTimerEx(const char *name, U8 flag, void *parameter, RTOS_TimerFunctionT callbackFunction)
- {
- U8 timer_flag = 0;
- if(flag & RTOS_TIMER_FLAG_PERIODIC)
- {
- timer_flag = timer_flag | RT_TIMER_FLAG_PERIODIC;
- }
- else
- {
- timer_flag = timer_flag | RT_TIMER_FLAG_ONE_SHOT;
- }
- if(flag & RTOS_TIMER_FLAG_SOFT_TIMER)
- {
- timer_flag = timer_flag | RT_TIMER_FLAG_SOFT_TIMER;
- }
- else
- {
- timer_flag = timer_flag | RT_TIMER_FLAG_SOFT_TIMER;
- }
- return (RTOS_TimerT)rt_timer_create(name, callbackFunction, parameter, 0, timer_flag);
- }
- U32 RTOS_DestroyTimer(RTOS_TimerT timerHandle)
- {
- return rt_timer_delete((rt_timer_t)timerHandle);
- }
- U32 RTOS_StartTimer(RTOS_TimerT timerHandle, U32 fireInterval)
- {
- rt_timer_t handler = (rt_timer_t)timerHandle;
- handler->init_tick = fireInterval;
- return rt_timer_start((rt_timer_t)timerHandle);
- }
- U32 RTOS_StopTimer(RTOS_TimerT timerHandle)
- {
- return rt_timer_stop((rt_timer_t)timerHandle);
- }
- U32 RTOS_ControlTimer(RTOS_TimerT timerHandle, U32 delay_time)
- {
- return rt_timer_control((rt_timer_t)timerHandle, RT_TIMER_CTRL_SET_TIME, &delay_time);
- }
- U32 RTOS_GetTimerStatus(RTOS_TimerT timerHandle)
- {
- rt_timer_t t;
- t = (rt_timer_t)timerHandle;
- if(t->parent.flag & RT_TIMER_FLAG_ACTIVATED)
- {
- return RTOS_TIMER_FLAG_ACTIVATED;
- }
- else
- {
- return RTOS_TIMER_FLAG_DEACTIVATED;
- }
- }
- void *RTOS_timer_get_context(RTOS_TimerT timerHandle)
- {
- rt_timer_t t;
- t = (rt_timer_t)timerHandle;
- return t->parameter;
- }
- int RTOS_Thead_Switch_Priority(int priority)
- {
- if (priority < RTOS_ThreadPriorityHighest)
- {
- priority = RTOS_ThreadPriorityHighest - priority;
- }
- else
- {
- priority = 1;
- }
- return priority;
- }
- void usleep(int micro_sec)
- {
- int ms = micro_sec/1000;
- rt_thread_delay(ms);
- }
- void sleep(int sec)
- {
- rt_thread_delay(sec*1000);
- }
|