rtos_lib.c 35 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445
  1. #include <sys/time.h>
  2. #include <time.h>
  3. #include "rtos_lib.h"
  4. #include "gd_timer.h"
  5. #include "gm_debug.h"
  6. #include "rtthread.h"
  7. #include "shell.h"
  8. #ifdef RT_USING_FINSH
  9. #include "shell.h"
  10. #endif
  11. //#define CACHE_MEM_MANAGE
  12. #define CACHE_MEM_SIZE 0x200000//1152k
  13. #define CACHE_DSP_SIZE 0x330000//3168k
  14. #define CACHE_LINE_SIZE 32
  15. #define CACHE_LINE_MASK ~(CACHE_LINE_SIZE - 1)
  16. static int cache_check_end = 0;
  17. static int cache_check_start = 1;
  18. //static int cache_check_fail_halt = 0;
  19. void RTOS_MMU_ChangeMapEntry(U32 vaddrStart, U32 vaddrEnd, U32 paddrStart, U32 attr);
  20. static inline void __delay(int loops);
  21. u32 cpu_cpsr;
  22. #define HZ RT_TICK_PER_SECOND
  23. #define LPS_PREC 8
  24. #define jiffies raid6_jiffies()
  25. static inline void __delay(int loops)
  26. {
  27. return;
  28. }
  29. static inline unsigned int raid6_jiffies(void)
  30. {
  31. //struct timeval tv;
  32. //gettimeofday(&tv, NULL);
  33. //return tv.tv_sec*1000 + tv.tv_usec/1000;
  34. return rt_tick_get()*1000;
  35. }
  36. static unsigned long calibrate_delay_converge(void)
  37. {
  38. /* First stage - slowly accelerate to find initial bounds */
  39. unsigned long lpj, lpj_base, ticks, loopadd, loopadd_base, chop_limit;
  40. int trials = 0, band = 0, trial_in_band = 0;
  41. lpj = (1<<12);
  42. /* wait for "start of" clock tick */
  43. ticks = jiffies;
  44. while (ticks == jiffies)
  45. ; /* nothing */
  46. /* Go .. */
  47. ticks = jiffies;
  48. do {
  49. if (++trial_in_band == (1<<band)) {
  50. ++band;
  51. trial_in_band = 0;
  52. }
  53. __delay(lpj * band);
  54. trials += band;
  55. } while (ticks == jiffies);
  56. /*
  57. * We overshot, so retreat to a clear underestimate. Then estimate
  58. * the largest likely undershoot. This defines our chop bounds.
  59. */
  60. trials -= band;
  61. loopadd_base = lpj * band;
  62. lpj_base = lpj * trials;
  63. recalibrate:
  64. lpj = lpj_base;
  65. loopadd = loopadd_base;
  66. /*
  67. * Do a binary approximation to get lpj set to
  68. * equal one clock (up to LPS_PREC bits)
  69. */
  70. chop_limit = lpj >> LPS_PREC;
  71. while (loopadd > chop_limit) {
  72. lpj += loopadd;
  73. ticks = jiffies;
  74. while (ticks == jiffies)
  75. ; /* nothing */
  76. ticks = jiffies;
  77. __delay(lpj);
  78. if (jiffies != ticks) /* longer than 1 tick */
  79. lpj -= loopadd;
  80. loopadd >>= 1;
  81. }
  82. /*
  83. * If we incremented every single time possible, presume we've
  84. * massively underestimated initially, and retry with a higher
  85. * start, and larger range. (Only seen on x86_64, due to SMIs)
  86. */
  87. if (lpj + loopadd * 2 == lpj_base + loopadd_base * 2) {
  88. lpj_base = lpj;
  89. loopadd_base <<= 2;
  90. goto recalibrate;
  91. }
  92. return lpj;
  93. }
  94. void RTOS_Jiffies()
  95. {
  96. unsigned long lpj;
  97. lpj = calibrate_delay_converge();
  98. rt_kprintf("Calibrating delay loop... %lu.%02lu BogoMIPS (lpj=%lu)\n",
  99. lpj/(500000/HZ),
  100. (lpj/(5000/HZ)) % 100, lpj);
  101. }
  102. void gk7101_setting_pll()
  103. {
  104. int i = 0;
  105. *((volatile U32 *)0x70170000) = 0x01202e01;
  106. *((volatile U32 *)0x70170004) = 0x00000000;
  107. *((volatile U32 *)0x7017000C) = 0x0000000c;
  108. *((volatile U32 *)0x70170014) = 0x01202401;
  109. *((volatile U32 *)0x70170018) = 0x00000000;
  110. *((volatile U32 *)0x7017001C) = 0x00000001;
  111. *((volatile U32 *)0x70170024) = 0x02406301;
  112. *((volatile U32 *)0x70170028) = 0x00000000;
  113. *((volatile U32 *)0x70170030) = 0x00000000;
  114. *((volatile U32 *)0x70170034) = 0x00000000;
  115. *((volatile U32 *)0x70170038) = 0x00000001;
  116. *((volatile U32 *)0x7017003C) = 0x00000008;
  117. *((volatile U32 *)0x7017004C) = 0x00000001;
  118. *((volatile U32 *)0x70170050) = 0x00000001;
  119. *((volatile U32 *)0x70170054) = 0x01202001;
  120. *((volatile U32 *)0x70170058) = 0x00c49ba5;
  121. *((volatile U32 *)0x7017005C) = 0x00000008;
  122. *((volatile U32 *)0x70170060) = 0x00000001;
  123. *((volatile U32 *)0x70170068) = 0x00000002;
  124. *((volatile U32 *)0x70170080) = 0x00206978;
  125. *((volatile U32 *)0x70170084) = 0x00000020;
  126. *((volatile U32 *)0x7017008C) = 0x0000000f;
  127. *((volatile U32 *)0x7017009C) = 0x00000002;
  128. *((volatile U32 *)0x701700A0) = 0x00000010;
  129. *((volatile U32 *)0x701700BC) = 0x00000001;
  130. *((volatile U32 *)0x701700E4) = 0x01203201;
  131. *((volatile U32 *)0x701700E8) = 0x00000000;
  132. *((volatile U32 *)0x701700EC) = 0x00000008;
  133. *((volatile U32 *)0x70170100) = 0x00000030;
  134. *((volatile U32 *)0x70170108) = 0x00000030;
  135. *((volatile U32 *)0x70170118) = 0x00000002;
  136. *((volatile U32 *)0x7017011C) = 0x00000030;
  137. *((volatile U32 *)0x70170124) = 0x00000030;
  138. *((volatile U32 *)0x70170130) = 0x00000030;
  139. *((volatile U32 *)0x70170148) = 0x00000001;
  140. *((volatile U32 *)0x70170198) = 0x00000000;
  141. *((volatile U32 *)0x7017019C) = 0x00000000;
  142. *((volatile U32 *)0x701701E0) = 0x00000000;
  143. *((volatile U32 *)0x701701E4) = 0x00000000;
  144. *((volatile U32 *)0x701701F4) = 0x00000002;
  145. *((volatile U32 *)0x701701FC) = 0x00000021;
  146. *((volatile U32 *)0x70170200) = 0x00000022;
  147. *((volatile U32 *)0x70170214) = 0x00000022;
  148. #if 0
  149. *((volatile U32 *)0x7017021C) = 0x00000000;
  150. *((volatile U32 *)0x70170228) = 0x00000000;
  151. *((volatile U32 *)0x7017022C) = 0x00000000;
  152. #endif
  153. for(i=0; i<14; i++)
  154. {
  155. *((volatile U32 *)((U32)0x70170230 + i*4)) = 0x11111111;
  156. }
  157. #if 0
  158. *((volatile U32 *)0x70170270) = 0x00000000;
  159. #endif
  160. *(volatile U32 *)(0x70009100+20*4) = (1<<8);
  161. *(volatile U32 *)(0x70009200+7*4) = 20;
  162. *(volatile U32 *)(0x70009100+22*4) = 9;
  163. }
  164. //-------------------------------------------------------
  165. #if 0
  166. rt_inline unsigned int rt_list_len(const rt_list_t *l)
  167. {
  168. unsigned int len = 0;
  169. const rt_list_t *p = l;
  170. while (p->next != l)
  171. {
  172. p = p->next;
  173. len ++;
  174. }
  175. return len;
  176. }
  177. #endif
  178. static void show_wait_queue(struct rt_list_node *list)
  179. {
  180. struct rt_thread *thread;
  181. struct rt_list_node *node;
  182. for (node = list->next; node != list; node = node->next)
  183. {
  184. thread = rt_list_entry(node, struct rt_thread, tlist);
  185. rt_kprintf("%s", thread->name);
  186. if (node->next != list)
  187. rt_kprintf("/");
  188. }
  189. }
  190. void rtos_cache_inv_range(void *addr, unsigned int size)
  191. {
  192. u32 vstart;
  193. u32 vend;
  194. u32 addr_tmp;
  195. vstart = (u32)addr & CACHE_LINE_MASK;
  196. vend = ((u32)addr + size + CACHE_LINE_SIZE - 1) & CACHE_LINE_MASK;
  197. if (cache_check_start && (vstart != (u32)addr)) {
  198. return;
  199. }
  200. if (cache_check_end && (vend != ((u32)addr + size))) {
  201. return;
  202. }
  203. for (addr_tmp = vstart; addr_tmp < vend; addr_tmp += CACHE_LINE_SIZE) {
  204. __asm__ __volatile__ (
  205. "mcr p15, 0, %0, c7, c6, 1" : : "r" (addr_tmp));
  206. }
  207. dsb();
  208. }
  209. void rtos_cache_clean_range(void *addr, unsigned int size)
  210. {
  211. u32 vstart;
  212. u32 vend;
  213. u32 addr_tmp;
  214. vstart = (u32)addr & CACHE_LINE_MASK;
  215. vend = ((u32)addr + size + CACHE_LINE_SIZE - 1) & CACHE_LINE_MASK;
  216. if (cache_check_start && (vstart != (u32)addr)) {
  217. return;
  218. }
  219. if (cache_check_end && (vend != ((u32)addr + size))) {
  220. return;
  221. }
  222. for (addr_tmp = vstart; addr_tmp < vend; addr_tmp += CACHE_LINE_SIZE) {
  223. __asm__ __volatile__ (
  224. "mcr p15, 0, %0, c7, c10, 1" : : "r" (addr_tmp));
  225. }
  226. dsb();
  227. }
  228. U32 RTOS_EnterCriticalSection( void )
  229. {
  230. #if 0
  231. /*lint -save -e529 */
  232. U32 old_flags = 0;
  233. U32 new_flags = 0;
  234. #if defined(_ARM) && !defined(__GNUC__) && !defined(__polyspace__)
  235. __asm { mrs old_flags,cpsr }
  236. __asm { orr new_flags,old_flags,#0xC0 }
  237. __asm { msr cpsr_c,new_flags }
  238. #endif
  239. #if defined(_ARM) && defined(__GNUC__) && !defined(__polyspace__)
  240. asm volatile( "mrs %0,cpsr" : "=r"(old_flags) : "r"(new_flags) );
  241. asm volatile( "orr %0,%1,#0xC0" : "=r"(new_flags) : "r"(old_flags) );
  242. asm volatile( "msr cpsr_c,%0" : : "r"(new_flags) );
  243. #endif
  244. #if defined(_ARC) && !defined(__polyspace__)
  245. old_flags = _lr(0);
  246. _flag(0);
  247. #endif
  248. return( old_flags );
  249. #else
  250. return (U32)rt_hw_interrupt_disable();
  251. #endif
  252. /*lint -restore */
  253. }
  254. void RTOS_LeaveCriticalSection( U32 cpuStatus )
  255. {
  256. #if 0
  257. /*lint -save -e715 */
  258. #if defined(_ARM) && !defined(__GNUC__) && !defined(__polyspace__)
  259. __asm { msr cpsr_c,cpuStatus }
  260. #endif
  261. #if defined(_ARM) && defined(__GNUC__) && !defined(__polyspace__)
  262. asm volatile ( "msr cpsr_c,%0" : : "r"(cpuStatus) );
  263. #endif
  264. #if defined(_ARC) && !defined(__polyspace__)
  265. cpuStatus &= 0x0C000000;
  266. _flag( cpuStatus >> 25 );
  267. #endif
  268. #else
  269. rt_hw_interrupt_enable(cpuStatus);
  270. #endif
  271. /*lint -restore */
  272. }
  273. void RTOS_Halt( void )
  274. {
  275. RTOS_EnterCriticalSection();
  276. }
  277. //-------------------------------------------------------------
  278. RTOS_Memory RTOS_MemorySet( RTOS_Memory mem, U8 value, RTOS_Size bytes )
  279. {
  280. if( ( mem == (RTOS_Memory)0 ) || ( bytes == 0 ) )
  281. return( (RTOS_Memory)0 );
  282. #if 0
  283. return rt_memset(mem,value,bytes);
  284. #else// use libc 's memset to improve performance.
  285. return memset(mem,value,bytes);
  286. #endif
  287. }
  288. RTOS_Memory RTOS_Malloc( RTOS_Size bytes)
  289. {
  290. return rt_malloc(bytes);
  291. }
  292. RTOS_Memory RTOS_Realloc( RTOS_Memory addr, RTOS_Size bytes )
  293. {
  294. return rt_realloc(addr, bytes);
  295. }
  296. char * RTOS_ThreadGetSelfName(void);
  297. RTOS_Memory RTOS_MemoryAllocate( RTOS_Size bytes, RTOS_Flag shared )
  298. {
  299. //if (bytes >= 0x10000)
  300. // printf("RTOS_MemoryAllocate: %d(%s)\n",bytes, RTOS_ThreadGetSelfName());
  301. return rt_malloc(bytes);
  302. }
  303. RTOS_Status RTOS_MemoryRelease( RTOS_Memory memory )
  304. {
  305. if(memory) rt_free(memory);
  306. return 0;
  307. }
  308. RTOS_Memory RTOS_SysMemoryAllocate( RTOS_Size bytes, RTOS_Flag shared )
  309. {
  310. #ifndef CACHE_MEM_MANAGE
  311. return (RTOS_Memory)rt_malloc(bytes);
  312. #else
  313. return (RTOS_Memory)rt_dspmem_malloc(bytes);
  314. #endif
  315. }
  316. RTOS_Status RTOS_SysMemoryRelease( RTOS_Memory memory )
  317. {
  318. if(memory)
  319. #ifndef CACHE_MEM_MANAGE
  320. rt_free(memory);
  321. #else
  322. rt_dspmem_free(memory);
  323. #endif
  324. return 0;
  325. }
  326. RTOS_Memory RTOS_KernelMemoryAllocate( RTOS_Size bytes)
  327. {
  328. return (RTOS_Memory)RT_KERNEL_MALLOC(bytes);
  329. }
  330. RTOS_Status RTOS_KernelMemoryRelease( RTOS_Memory memory )
  331. {
  332. if(memory)
  333. RT_KERNEL_FREE(memory);
  334. return 0;
  335. }
  336. void RTOS_GetMemInfo( RTOS_Size *Cache_memory, RTOS_Size *Uncache_memory)
  337. {
  338. rt_uint32_t total,used,max_used;
  339. rt_memory_info(&total,&used,&max_used);
  340. *Cache_memory = total;
  341. *Uncache_memory = 0;
  342. #ifdef CACHE_MEM_MANAGE
  343. rt_cache_memory_info(&total,&used,&max_used);
  344. *Uncache_memory = total;
  345. #endif
  346. }
  347. void RTOS_HeapMemoryReport( void )
  348. {
  349. rt_uint32_t total,used,max_used;
  350. rt_memory_info(&total,&used,&max_used);
  351. rt_kprintf("Heap Memory Info [cache memory]\n");
  352. rt_kprintf("total memory: %d KBytes,%d Btyes\n", total/1024,total);
  353. rt_kprintf("used memory : %d KBytes,%d Btyes\n", used/1024,used);
  354. rt_kprintf("maximum allocated memory: %d KBytes,%d Btyes\n", max_used/1024,max_used);
  355. }
  356. void RTOS_SysMemoryReport( void )
  357. {
  358. #ifdef CACHE_MEM_MANAGE
  359. rt_uint32_t total,used,max_used;
  360. rt_cache_memory_info(&total,&used,&max_used);
  361. rt_kprintf("Sys Memory Info [cache memory]\n");
  362. rt_kprintf("total memory: %d KBytes\n", total/1024);
  363. rt_kprintf("used memory : %d KBytes\n", used/1024);
  364. rt_kprintf("maximum allocated memory: %d KBytes\n", max_used/1024);
  365. rt_dspmem_memory_info(&total,&used,&max_used);
  366. rt_kprintf("Drv Memory Info [uncache memory]\n");
  367. rt_kprintf("total memory: %d KBytes\n", total/1024);
  368. rt_kprintf("used memory : %d KBytes\n", used/1024);
  369. rt_kprintf("maximum allocated memory: %d KBytes\n", max_used/1024);
  370. #endif
  371. }
  372. RTOS_Memory RTOS_MemoryCopy( RTOS_Memory dst, RTOS_Memory src, RTOS_Size bytes )
  373. {
  374. #if 0
  375. U8* dstArray = (U8*)dst;
  376. U8* srcArray = (U8*)src;
  377. RTOS_Size index;
  378. if( ( dst == (RTOS_Memory)0 ) || ( bytes == 0 ) )
  379. return( (RTOS_Memory)0 );
  380. for( index=0; index < bytes; index++ )
  381. dstArray[index] = srcArray[index];
  382. return( dst );
  383. #else// use libc 's memcpy to improve performance.
  384. if( ( dst == (RTOS_Memory)0 ) || ( bytes == 0 ) )
  385. return( (RTOS_Memory)0 );
  386. memcpy(dst, src, bytes);
  387. return( dst );
  388. #endif
  389. }
  390. //-------------------------------------------------------------
  391. U32 RTOS_SetThreadName( RTOS_ThreadT threadHandle, const char* optName)
  392. {
  393. rt_base_t level;
  394. level = rt_hw_interrupt_disable();
  395. if(threadHandle)
  396. {
  397. rt_strncpy(((rt_thread_t)threadHandle)->name, optName, RT_NAME_MAX);
  398. }
  399. rt_hw_interrupt_enable(level);
  400. return 0;
  401. }
  402. U32 RTOS_ThreadSetName( RTOS_ThreadT threadHandle, const char* optName)
  403. {
  404. rt_base_t level;
  405. level = rt_hw_interrupt_disable();
  406. if(threadHandle)
  407. {
  408. rt_strncpy(((rt_thread_t)threadHandle)->name, optName, RT_NAME_MAX);
  409. }
  410. rt_hw_interrupt_enable(level);
  411. return 0;
  412. }
  413. char * RTOS_ThreadGetSelfName(void)
  414. {
  415. return rt_thread_self()->name;
  416. }
  417. // thread-safe errno related api functions.
  418. void RTOS_SetErrno(const int err)
  419. {
  420. #if 0
  421. rt_base_t level;
  422. level = rt_hw_interrupt_disable();
  423. rt_thread_t self = rt_thread_self();
  424. self->thr_internal_errno = err;//FIXME(heyong): error is used to errno.
  425. rt_hw_interrupt_enable(level);
  426. //rt_kprintf("RTOS_SetErrno %d\n", err);
  427. #endif
  428. }
  429. int RTOS_GetErrno()
  430. {
  431. int err;
  432. #if 0
  433. rt_base_t level;
  434. level = rt_hw_interrupt_disable();
  435. rt_thread_t self = rt_thread_self();
  436. err = (int)self->thr_internal_errno;//FIXME(heyong): error is used to errno.
  437. rt_hw_interrupt_enable(level);
  438. //rt_kprintf("RTOS_GetErrno %d\n", err);
  439. #endif
  440. return err;
  441. }
  442. RTOS_ThreadT RTOS_CreateThread(
  443. U32* stackBuffer, U32 stackSize, U32 priority,
  444. RTOS_ThreadFunctionT function, void* optArg, void* optData,
  445. const char* optName )
  446. {
  447. rt_thread_t tid;
  448. if (priority < RTOS_ThreadPriorityHighest)
  449. {
  450. priority = RTOS_ThreadPriorityHighest - priority;
  451. }
  452. else
  453. {
  454. priority = 1;
  455. }
  456. tid = rt_thread_create((optName == NULL)?"thread":optName,
  457. function, optArg,
  458. stackSize, priority, THREAD_TIMESLICE);
  459. if (tid != RT_NULL)
  460. {
  461. rt_thread_startup(tid);
  462. }
  463. return (RTOS_ThreadT)tid;
  464. }
  465. U32 RTOS_DestroyThread( RTOS_ThreadT threadHandle )
  466. {
  467. rt_err_t ret = 0;
  468. rt_enter_critical();
  469. ret = rt_thread_delete((rt_thread_t)threadHandle);
  470. rt_exit_critical();
  471. if (RT_EOK == ret)
  472. {
  473. ret = 1;
  474. }
  475. else
  476. {
  477. ret = 0;
  478. }
  479. return ret;
  480. }
  481. U32 RTOS_ThreadDestroy( RTOS_ThreadT threadHandle )
  482. {
  483. rt_err_t ret = 0;
  484. rt_enter_critical();
  485. ret = rt_thread_delete((rt_thread_t)threadHandle);
  486. rt_exit_critical();
  487. if (RT_EOK == ret)
  488. {
  489. ret = 1;
  490. }
  491. else
  492. {
  493. ret = 0;
  494. }
  495. return ret;
  496. }
  497. U32 RTOS_GetThreadPriority(RTOS_ThreadT threadHandle)
  498. {
  499. rt_thread_t tid = (rt_thread_t)threadHandle;
  500. int priority = tid->current_priority;
  501. if (priority < RTOS_ThreadPriorityHighest)
  502. {
  503. priority = RTOS_ThreadPriorityHighest - priority;
  504. }
  505. else
  506. {
  507. priority = 1;
  508. }
  509. return priority;
  510. }
  511. void gkosFinishThread( void )
  512. {
  513. //rt_thread_t t = rt_thread_self();
  514. //rt_thread_detach(t);
  515. }
  516. void RTOS_LockScheduler( void )
  517. {
  518. rt_enter_critical();
  519. }
  520. void RTOS_UnlockScheduler( void )
  521. {
  522. rt_exit_critical();
  523. }
  524. void RTOS_SchedulerLock( void )
  525. {
  526. rt_enter_critical();
  527. }
  528. void RTOS_SchedulerUnlock( void )
  529. {
  530. rt_exit_critical();
  531. }
  532. U32 RTOS_SleepThread( U32 msecs )
  533. {
  534. return rt_thread_delay( msecs ) ;
  535. }
  536. U32 msleep( U32 msecs )
  537. {
  538. return rt_thread_delay( msecs ) ;
  539. }
  540. U32 RTOS_SuspendThread( RTOS_ThreadT threadHandle )
  541. {
  542. return rt_thread_suspend((rt_thread_t)threadHandle);
  543. }
  544. U32 RTOS_WakeupThread( RTOS_ThreadT threadHandle )
  545. {
  546. return rt_thread_resume( (rt_thread_t)threadHandle );
  547. }
  548. void thread_statistics()
  549. {
  550. struct rt_thread *thread;
  551. struct rt_list_node *node;
  552. rt_uint8_t *ptr;
  553. rt_base_t level;
  554. struct rt_object_information *information;
  555. information = rt_object_get_information(RT_Object_Class_Thread);
  556. RT_ASSERT(information != RT_NULL);
  557. struct rt_list_node *list = &(information->object_list);
  558. level = rt_hw_interrupt_disable();
  559. for (node = list->next; node != list; node = node->next)
  560. {
  561. thread = rt_list_entry(node, struct rt_thread, list);
  562. //if(thread) thread->total_tick = 0;
  563. }
  564. rt_hw_interrupt_enable(level);
  565. rt_thread_delay(5000);
  566. //not close interrupt to avoid the venc error because the print time is too long.
  567. //level = rt_hw_interrupt_disable();
  568. rt_kprintf(" thread pri status tick cpu%% sp stack addr stack size max used left tick\n");
  569. rt_kprintf("-------------------------------- --- ------- ------ ------- ---------- ---------- ---------- ---------- ---------- \n");
  570. for (node = list->next; node != list; node = node->next)
  571. {
  572. thread = rt_list_entry(node, struct rt_thread, list);
  573. #if 0
  574. rt_kprintf("%-32.*s 0x%02x", RT_NAME_MAX, thread->name, thread->current_priority);
  575. #else
  576. int priority = thread->current_priority;
  577. if (priority < RTOS_ThreadPriorityHighest)
  578. {
  579. priority = RTOS_ThreadPriorityHighest - priority;
  580. }
  581. else
  582. {
  583. priority = 1;
  584. }
  585. rt_kprintf("%-32.*s %3d", RT_NAME_MAX, thread->name, priority);
  586. #endif
  587. if (thread->stat == RT_THREAD_READY) rt_kprintf(" ready");
  588. else if (thread->stat == RT_THREAD_SUSPEND) rt_kprintf(" suspend");
  589. else if (thread->stat == RT_THREAD_INIT) rt_kprintf(" init");
  590. else if (thread->stat == RT_THREAD_CLOSE) rt_kprintf(" close");
  591. ptr = (rt_uint8_t*)thread->stack_addr;
  592. while (*ptr == '#')ptr ++;
  593. #if 0
  594. rt_kprintf(" %5d %5.2f%% 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x \n",
  595. thread->total_tick,
  596. ((double)thread->total_tick/50)>=100.00?99.9:((double)thread->total_tick/50),
  597. thread->stack_size + ((rt_uint32_t)thread->stack_addr - (rt_uint32_t)thread->sp),
  598. thread->stack_addr,
  599. thread->stack_size,
  600. thread->stack_size - ((rt_uint32_t) ptr - (rt_uint32_t)thread->stack_addr),
  601. thread->remaining_tick);
  602. #endif
  603. rt_kprintf(" 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x \n",
  604. thread->stack_size + ((rt_uint32_t)thread->stack_addr - (rt_uint32_t)thread->sp),
  605. thread->stack_addr,
  606. thread->stack_size,
  607. thread->stack_size - ((rt_uint32_t) ptr - (rt_uint32_t)thread->stack_addr),
  608. thread->remaining_tick);
  609. }
  610. //rt_hw_interrupt_enable(level);
  611. }
  612. void RTOS_ThreadDisplayStatistics( void )
  613. {
  614. rt_uint32_t total;
  615. rt_uint32_t used;
  616. rt_uint32_t max_used;
  617. rt_memory_info(&total,&used,&max_used);
  618. rt_kprintf("\n memory info size \n");
  619. rt_kprintf("--------------------------------- -------\n");
  620. rt_kprintf("total heap memory : %d(%dKB)\n", total, total/1024);
  621. rt_kprintf("used heap memory : %d(%dKB)\n", used, used/1024);
  622. rt_kprintf("maximum allocated heap memory: %d(%dKB)\n\n", max_used, max_used/1024);
  623. #ifdef CACHE_MEM_MANAGE
  624. rt_cache_memory_info(&total,&used,&max_used);
  625. rt_kprintf("total sys memory : %d(%dKB)\n", total, total/1024);
  626. rt_kprintf("used sys memory : %d(%dKB)\n", used, used/1024);
  627. rt_kprintf("maximum allocated sys memory: %d(%dKB)\n", max_used, max_used/1024);
  628. rt_dspmem_memory_info(&total,&used,&max_used);
  629. rt_kprintf("total drv memory : %d(%dKB)\n", total, total/1024);
  630. rt_kprintf("used drv memory : %d(%dKB)\n", used, used/1024);
  631. rt_kprintf("maximum allocated drv memory: %d(%dKB)\n", max_used, max_used/1024);
  632. #endif
  633. thread_statistics();
  634. return ;
  635. }
  636. U32 RTOS_GetFreeHeapSize()
  637. {
  638. rt_uint32_t total;
  639. rt_uint32_t used;
  640. rt_uint32_t max_used;
  641. rt_memory_info(&total,&used,&max_used);
  642. return (total-used);
  643. }
  644. RTOS_Time RTOS_KernelTimerGetPeriod(void)
  645. {
  646. return (1000 / RT_TICK_PER_SECOND);
  647. }
  648. //-------------------------sem--------------------------
  649. RTOS_SemaphoreT RTOS_CreateSemaphore( U32 initCount )
  650. {
  651. return (RTOS_SemaphoreT)rt_sem_create("sem", initCount, RT_IPC_FLAG_PRIO);
  652. }
  653. U32 RTOS_WaitSemaphore(RTOS_SemaphoreT semaphoreHandle, U32 suspend)
  654. {
  655. if(suspend)
  656. return RTOS_GetSemaphore((RTOS_Semaphore)semaphoreHandle, RTOS_SUSPEND);
  657. else
  658. return RTOS_GetSemaphore((RTOS_Semaphore)semaphoreHandle, RTOS_NO_SUSPEND);
  659. }
  660. U32 RTOS_GetSemaphore( RTOS_SemaphoreT semaphoreHandle,
  661. U32 msecsTimeout )
  662. {
  663. return rt_sem_take((rt_sem_t)semaphoreHandle, msecsTimeout);
  664. }
  665. U32 RTOS_SetSemaphore( RTOS_SemaphoreT semaphoreHandle,
  666. U32 msecsTimeout )
  667. {
  668. return rt_sem_release((rt_sem_t)semaphoreHandle);
  669. }
  670. RTOS_Status RTOS_SemaphoreDestroy( RTOS_Semaphore semaphoreHandle )
  671. {
  672. return rt_sem_delete((rt_sem_t)semaphoreHandle);
  673. }
  674. RTOS_Status RTOS_DestroySemaphore( RTOS_Semaphore semaphoreHandle )
  675. {
  676. return rt_sem_delete((rt_sem_t)semaphoreHandle);
  677. }
  678. S32 RTOS_SemaphoreQuery( RTOS_Semaphore semaphoreHandle )
  679. {
  680. S32 countPtr = 0;
  681. rt_ubase_t level;
  682. level = rt_hw_interrupt_disable();
  683. countPtr = ((rt_sem_t)semaphoreHandle)->value;
  684. rt_hw_interrupt_enable(level);
  685. return (S32)countPtr;
  686. }
  687. //-------------------------timer-------------------------
  688. void GKOS_KernelTimerSetHook(RTOS_HookFunction function)
  689. {
  690. if(gkosHookData)
  691. {
  692. if(gkosHookData->timerFunctionCount < (GKOS_TIMER_HOOK_TABLE_SIZE - 1))
  693. {
  694. gkosHookData->timerFunctionArray[gkosHookData->timerFunctionCount] = function;
  695. gkosHookData->timerFunctionCount ++;
  696. }
  697. }
  698. }
  699. void RTOS_KernelTimerSetHook(RTOS_HookFunction function)
  700. {
  701. GKOS_KernelTimerSetHook(function);
  702. }
  703. //-------------------------mail queue-------------------------
  704. #if 0
  705. RTOS_MailqueueT RTOS_MailqueueCreate( U32 queueElements)
  706. {
  707. struct rt_mailbox *mq;
  708. mq = rt_mb_create("mqt", queueElements, RT_IPC_FLAG_FIFO);
  709. return (RTOS_MailqueueT)mq;
  710. }
  711. #endif
  712. RTOS_MailqueueT RTOS_CreateMailqueue( U32 queueElements, U32 elementBytes )
  713. {
  714. struct rt_mailbox *mq;
  715. mq = rt_mb_create("mqt", queueElements, RT_IPC_FLAG_FIFO);
  716. return (RTOS_MailqueueT)mq;
  717. }
  718. RTOS_Status RTOS_MailqueueSend(RTOS_Mailqueue mailqueue, RTOS_Message data)
  719. {
  720. //rt_kprintf("mail send...0x%x\n", data);
  721. return rt_mb_send((rt_mailbox_t)mailqueue, (rt_uint32_t)data);
  722. }
  723. RTOS_Status RTOS_MailqueueSendTimeout(RTOS_Mailqueue mailqueue, RTOS_Message data, RTOS_Time timeout)
  724. {
  725. //rt_kprintf("mail send...0x%x\n", data);
  726. return rt_mb_send_wait((rt_mailbox_t)mailqueue, (rt_uint32_t)data, timeout);
  727. }
  728. RTOS_Message RTOS_MailqueueWait(RTOS_Mailqueue mailqueue, RTOS_Flag suspend)
  729. {
  730. int ret;
  731. U32 timeout;
  732. U8* messagePtr;
  733. if( suspend )
  734. timeout = RTOS_SUSPEND;
  735. else
  736. timeout = RTOS_NO_SUSPEND;
  737. ret = rt_mb_recv((rt_mailbox_t)mailqueue, (void*)(&messagePtr), timeout);
  738. //rt_kprintf("mail recv [0x%x]...0x%x\n", (U32)timeout, messagePtr);
  739. if(ret != 0)
  740. return NULL;
  741. return (RTOS_Message)messagePtr;
  742. }
  743. RTOS_Message RTOS_MailqueueWaitTimeout( RTOS_Mailqueue mailqueue, RTOS_Time timeout )
  744. {
  745. U8* messagePtr;
  746. int ret;
  747. ret = rt_mb_recv((rt_mailbox_t)mailqueue, (void*)(&messagePtr), timeout);
  748. //rt_kprintf("mail recv [0x%x]...0x%x\n", (U32)timeout, messagePtr);
  749. if(ret != 0)
  750. return NULL;
  751. return (RTOS_Message)messagePtr;
  752. }
  753. U32 RTOS_MailqueueDestroy( RTOS_MailqueueT mailqueuePtr )
  754. {
  755. rt_mb_delete((rt_mailbox_t)mailqueuePtr);
  756. return 0;
  757. }
  758. U32 RTOS_DestroyMailqueue( RTOS_MailqueueT mailqueuePtr )
  759. {
  760. rt_mb_delete((rt_mailbox_t)mailqueuePtr);
  761. return 0;
  762. }
  763. U32 RTOS_GetTimerStamp()
  764. {
  765. return rt_tick_get();
  766. }
  767. /*
  768. *******************************************************************************
  769. **
  770. ** Create a new mutex and initializes it with the given value.
  771. **
  772. *******************************************************************************
  773. */
  774. RTOS_MutexT RTOS_MutexCreate( void )
  775. {
  776. return( (RTOS_MutexT) rt_mutex_create("mutex", RT_IPC_FLAG_FIFO) );
  777. }
  778. /*
  779. *******************************************************************************
  780. **
  781. ** Destroy a given mutex.
  782. **
  783. *******************************************************************************
  784. */
  785. U32 RTOS_MutexDestroy( RTOS_MutexT mutex )
  786. {
  787. return rt_mutex_delete( (rt_mutex_t) mutex );
  788. }
  789. /*
  790. *******************************************************************************
  791. **
  792. ** Query (read) the current value from a given mutex.
  793. **
  794. *******************************************************************************
  795. */
  796. S32 RTOS_MutexQuery( RTOS_MutexT mutex )
  797. {
  798. S32 countPtr = 0;
  799. rt_ubase_t level;
  800. level = rt_hw_interrupt_disable();
  801. countPtr = ((rt_mutex_t)mutex)->value;
  802. rt_hw_interrupt_enable(level);
  803. return countPtr;
  804. }
  805. /*
  806. *******************************************************************************
  807. **
  808. ** Wait and lock a given mutex
  809. **
  810. *******************************************************************************
  811. */
  812. U32 RTOS_MutexLock( RTOS_MutexT mutex, RTOS_Flag suspend )
  813. {
  814. U32 timeout;
  815. if( suspend )
  816. timeout = RTOS_SUSPEND;
  817. else
  818. timeout = RTOS_NO_SUSPEND;
  819. return rt_mutex_take( (rt_mutex_t) mutex, timeout );
  820. }
  821. U32 RTOS_MutexLockTimeout( RTOS_MutexT mutex, U32 timeout )
  822. {
  823. return rt_mutex_take( (rt_mutex_t) mutex, timeout );
  824. }
  825. /*
  826. *******************************************************************************
  827. **
  828. ** Unlock an occupied mutex
  829. **
  830. *******************************************************************************
  831. */
  832. U32 RTOS_MutexUnlock( RTOS_MutexT mutex )
  833. {
  834. return rt_mutex_release( (rt_mutex_t) mutex );
  835. }
  836. //--------------------------------------------------------
  837. RTOS_ThreadT RTOS_ThreadSelf( void )
  838. {
  839. return( (RTOS_ThreadT)rt_thread_self() );
  840. }
  841. //-------------------------------------------------------
  842. extern unsigned char __heap_end__[];
  843. gkosHookDataT HookData;
  844. void RTOS_HwTickInit(void)
  845. {
  846. GD_HANDLE timerHandle;
  847. GBOOL timerFlag;
  848. GERR result;
  849. GD_INT_DisableAllInterrupts();
  850. // only use the os's timers
  851. // RTOS_TIMERTICK_IRQ must use the GD_INT_LOW_PRIORITY mode
  852. GD_INT_SetVector( GD_INT_TIMER1_IRQ, NULL );
  853. result = GD_TIMER_SoftTimerOpen( &timerHandle );
  854. if( result == GD_OK )
  855. {
  856. // modify the hard timer to Timer Tick
  857. result = GD_TIMER_SoftTimerSet( &timerHandle, 1, &timerFlag, NULL );
  858. GD_INT_SetVector( GD_INT_TIMER1_IRQ, rt_tick_increase );
  859. }
  860. int bytes = sizeof(gkosHookDataT);
  861. gkosHookData = &HookData;
  862. memset( gkosHookData, 0, bytes );
  863. }
  864. extern u32 ARM1176_MMU_ttb0[4096];
  865. U32 RTOS_InitKernel(U32 Heap_size)
  866. {
  867. u32 os_end_address=0;
  868. /* disable interrupt first */
  869. rt_hw_interrupt_disable();
  870. /* enable cpu cache */
  871. //rt_hw_cpu_icache_disable();
  872. //mmu_invalidate_icache();
  873. //rt_hw_cpu_icache_enable();
  874. /* initialize hardware interrupt */
  875. rt_hw_interrupt_init();
  876. /* initialize board */
  877. //rt_hw_board_init();
  878. /* show version */
  879. //rt_show_version();
  880. RTOS_HwTickInit();
  881. //rt_kprintf("set tick\n");
  882. /* initialize timer system */
  883. rt_system_timer_init();
  884. /* initialize heap memory system */
  885. os_end_address= (u32)__heap_end__+Heap_size;
  886. #ifdef CACHE_MEM_MANAGE
  887. rt_system_heap_init((void*)__heap_end__, (void*)(os_end_address-CACHE_MEM_SIZE-CACHE_DSP_SIZE));
  888. rt_system_cache_init((void*)(os_end_address-CACHE_MEM_SIZE-CACHE_DSP_SIZE),
  889. (void*)(os_end_address-CACHE_DSP_SIZE));
  890. //cache-buffer for system
  891. #if 0
  892. RTOS_MMU_ChangeMapEntry((U32)(os_end_address-CACHE_MEM_SIZE-CACHE_DSP_SIZE),(U32)os_end_address-CACHE_DSP_SIZE,
  893. (U32)(os_end_address-CACHE_MEM_SIZE), 0x00000DE2);
  894. #endif
  895. rt_system_dspmem_init((void*)(os_end_address-CACHE_DSP_SIZE), (void*)(os_end_address));
  896. //nocache nobuffer
  897. RTOS_MMU_ChangeMapEntry((U32)(os_end_address-CACHE_DSP_SIZE), (U32)os_end_address,
  898. (U32)(os_end_address-CACHE_DSP_SIZE), 0x00000DE2);
  899. /* print mmu table */
  900. //rt_hw_cpu_dump_page_table((rt_uint32_t*)ARM1176_MMU_ttb0);
  901. #else
  902. rt_system_heap_init((void*)__heap_end__, (void*)os_end_address);
  903. #endif
  904. #ifdef RT_USING_MODULE
  905. /* initialize module system*/
  906. rt_system_module_init();
  907. #endif
  908. /* initialize scheduler system */
  909. rt_system_scheduler_init();
  910. return 0;
  911. }
  912. void RTOS_StartMultitasking( void )
  913. {
  914. #ifdef RT_USING_FINSH
  915. /* initialize finsh */
  916. finsh_system_init();
  917. #ifdef RT_USING_DEVICE
  918. finsh_set_device(RT_CONSOLE_DEVICE_NAME);
  919. #endif
  920. #endif
  921. /* initialize system timer thread */
  922. rt_system_timer_thread_init();
  923. /* initialize idle thread */
  924. rt_thread_idle_init();
  925. rt_kprintf("start scheduler\n");
  926. /* start scheduler */
  927. rt_system_scheduler_start();
  928. /* never reach here */
  929. return ;
  930. }
  931. U32 RTOS_GetMailqueue( RTOS_MailqueueT mailqueueHandle,
  932. void* resultBuffer, U32 msecsTimeout )
  933. {
  934. return rt_mb_recv((rt_mailbox_t)mailqueueHandle,(rt_uint32_t*)resultBuffer,
  935. (rt_uint32_t)msecsTimeout);
  936. }
  937. U32 RTOS_SetMailqueue( RTOS_MailqueueT mailqueueHandle,
  938. void* messagePtr, U32 toFront,
  939. U32 msecsTimeout )
  940. {
  941. return rt_mb_send_wait((rt_mailbox_t)mailqueueHandle,
  942. (rt_uint32_t)messagePtr, (rt_uint32_t)msecsTimeout);
  943. }
  944. /*Dummy func of os*/
  945. //-----------------------------cond------------------------------
  946. RTOS_CondT RTOS_CondCreate( void )
  947. {
  948. rt_event_t evt;
  949. evt = rt_event_create("evt", 0);
  950. /* detach the object from system object container */
  951. rt_object_detach(&(evt->parent.parent));
  952. return (RTOS_CondT) evt;
  953. }
  954. RTOS_Status RTOS_CondDestroy( RTOS_CondT cond )
  955. {
  956. rt_err_t result;
  957. if (cond == RT_NULL)
  958. return -2;
  959. result = rt_event_delete((rt_event_t)cond);
  960. if (result != RT_EOK)
  961. return -3;
  962. return( 0 );
  963. }
  964. int _cond_timedwait(RTOS_CondT cond, RTOS_MutexT mutex, U32 timeout)
  965. {
  966. int result;
  967. rt_uint32_t recved = 0XFF;
  968. if (!cond || !mutex)
  969. return -1;
  970. if(RTOS_MutexUnlock(mutex)!=0) return -2;
  971. result = rt_event_recv((rt_event_t)cond, 0x01,RT_EVENT_FLAG_AND|RT_EVENT_FLAG_CLEAR,timeout,&recved);
  972. if(result == -RT_ERROR && recved == 0XFF) // for boardcase event
  973. {
  974. result = RT_EOK;
  975. }
  976. /* lock mutex again */
  977. RTOS_MutexLock(mutex, 1);
  978. return result;
  979. }
  980. RTOS_Status RTOS_CondWait( RTOS_CondT cond, RTOS_MutexT mutex, RTOS_Flag suspend )
  981. {
  982. S32 value = 0;
  983. U32 timeout;
  984. if( suspend )
  985. timeout = RTOS_SUSPEND;
  986. else
  987. timeout = RTOS_NO_SUSPEND;
  988. value = _cond_timedwait( (RTOS_CondT) cond, (RTOS_MutexT) mutex, timeout );
  989. if( value != RT_EOK )
  990. return( -1 );
  991. return( value );
  992. }
  993. RTOS_Status RTOS_CondWaitTimeout( RTOS_CondT cond, RTOS_MutexT mutex, U32 timeout )
  994. {
  995. S32 value = 0;
  996. value = _cond_timedwait( (RTOS_CondT) cond, (RTOS_MutexT) mutex, timeout );
  997. if( value != RT_EOK )
  998. return( -1 );
  999. return( value );
  1000. }
  1001. RTOS_Status RTOS_CondSignal( RTOS_CondT cond )
  1002. {
  1003. RTOS_Status result;
  1004. result = rt_event_send((rt_event_t)cond,0x01);
  1005. if (result != RT_EOK)
  1006. return -1;
  1007. return 0;
  1008. }
  1009. RTOS_Status RTOS_CondBroadcast( RTOS_CondT cond )
  1010. {
  1011. rt_event_control((rt_event_t)cond,RT_IPC_CMD_RESET,0);
  1012. return 0;
  1013. }
  1014. U32 RTOS_OsType(void)
  1015. {
  1016. return RTOS_RTTHREAD;
  1017. }
  1018. void RTOS_MMU_ChangeMapEntry(U32 vaddrStart, U32 vaddrEnd, U32 paddrStart, U32 attr)
  1019. {
  1020. volatile U32 *pTT;
  1021. volatile int i,nSec;
  1022. extern U32 ARM1176_MMU_ttb0[];
  1023. extern U32 ARM1176_MMU_ttb1[];
  1024. U32* table_ptr = (U32*)ARM1176_MMU_ttb0;
  1025. //printf("mmu table: 0x%x \n", (U32)ARM1176_MMU_ttb0);
  1026. pTT = (U32 *)table_ptr + (vaddrStart>>20);
  1027. nSec = (vaddrEnd>>20) - (vaddrStart>>20);
  1028. //printf("change table: 0x%x -- %d\n", (U32)pTT, nSec);
  1029. for(i=0;i<=nSec;i++)
  1030. {
  1031. *pTT = attr |(((paddrStart>>20)+i)<<20);
  1032. pTT++;
  1033. }
  1034. table_ptr = (U32*)ARM1176_MMU_ttb1;
  1035. //printf("mmu table: 0x%x \n", (U32)ARM1176_MMU_ttb1);
  1036. pTT = (U32 *)table_ptr + (vaddrStart>>20);
  1037. nSec = (vaddrEnd>>20) - (vaddrStart>>20);
  1038. //printf("change table: 0x%x -- %d\n", (U32)pTT, nSec);
  1039. for(i=0;i<=nSec;i++)
  1040. {
  1041. *pTT = attr |(((paddrStart>>20)+i)<<20);
  1042. pTT++;
  1043. }
  1044. }
  1045. int RTOS_thread_yield(void)
  1046. {
  1047. rt_thread_yield();
  1048. return 0;
  1049. }
  1050. unsigned int RTOS_jiffies(void)
  1051. {
  1052. return jiffies;
  1053. }
  1054. RTOS_TimerT RTOS_CreateTimer(U32 isContinouos, RTOS_SemaphoreT fireSemaphore, RTOS_HookFunctionT callbackFunction)
  1055. {
  1056. //U8 name[32];
  1057. //sprintf(name, "timer %X", (U32)callbackFunction);
  1058. if(isContinouos)
  1059. {
  1060. return (RTOS_TimerT)rt_timer_create("timer", callbackFunction, NULL, 0, RT_TIMER_FLAG_PERIODIC);
  1061. }
  1062. else
  1063. {
  1064. return (RTOS_TimerT)rt_timer_create("timer", callbackFunction, NULL, 0, RT_TIMER_FLAG_ONE_SHOT);
  1065. }
  1066. }
  1067. RTOS_TimerT RTOS_CreateTimerEx(const char *name, U8 flag, void *parameter, RTOS_TimerFunctionT callbackFunction)
  1068. {
  1069. U8 timer_flag = 0;
  1070. if(flag & RTOS_TIMER_FLAG_PERIODIC)
  1071. {
  1072. timer_flag = timer_flag | RT_TIMER_FLAG_PERIODIC;
  1073. }
  1074. else
  1075. {
  1076. timer_flag = timer_flag | RT_TIMER_FLAG_ONE_SHOT;
  1077. }
  1078. if(flag & RTOS_TIMER_FLAG_SOFT_TIMER)
  1079. {
  1080. timer_flag = timer_flag | RT_TIMER_FLAG_SOFT_TIMER;
  1081. }
  1082. else
  1083. {
  1084. timer_flag = timer_flag | RT_TIMER_FLAG_SOFT_TIMER;
  1085. }
  1086. return (RTOS_TimerT)rt_timer_create(name, callbackFunction, parameter, 0, timer_flag);
  1087. }
  1088. U32 RTOS_DestroyTimer(RTOS_TimerT timerHandle)
  1089. {
  1090. return rt_timer_delete((rt_timer_t)timerHandle);
  1091. }
  1092. U32 RTOS_StartTimer(RTOS_TimerT timerHandle, U32 fireInterval)
  1093. {
  1094. rt_timer_t handler = (rt_timer_t)timerHandle;
  1095. handler->init_tick = fireInterval;
  1096. return rt_timer_start((rt_timer_t)timerHandle);
  1097. }
  1098. U32 RTOS_StopTimer(RTOS_TimerT timerHandle)
  1099. {
  1100. return rt_timer_stop((rt_timer_t)timerHandle);
  1101. }
  1102. U32 RTOS_ControlTimer(RTOS_TimerT timerHandle, U32 delay_time)
  1103. {
  1104. return rt_timer_control((rt_timer_t)timerHandle, RT_TIMER_CTRL_SET_TIME, &delay_time);
  1105. }
  1106. U32 RTOS_GetTimerStatus(RTOS_TimerT timerHandle)
  1107. {
  1108. rt_timer_t t;
  1109. t = (rt_timer_t)timerHandle;
  1110. if(t->parent.flag & RT_TIMER_FLAG_ACTIVATED)
  1111. {
  1112. return RTOS_TIMER_FLAG_ACTIVATED;
  1113. }
  1114. else
  1115. {
  1116. return RTOS_TIMER_FLAG_DEACTIVATED;
  1117. }
  1118. }
  1119. void *RTOS_timer_get_context(RTOS_TimerT timerHandle)
  1120. {
  1121. rt_timer_t t;
  1122. t = (rt_timer_t)timerHandle;
  1123. return t->parameter;
  1124. }
  1125. int RTOS_Thead_Switch_Priority(int priority)
  1126. {
  1127. if (priority < RTOS_ThreadPriorityHighest)
  1128. {
  1129. priority = RTOS_ThreadPriorityHighest - priority;
  1130. }
  1131. else
  1132. {
  1133. priority = 1;
  1134. }
  1135. return priority;
  1136. }
  1137. void usleep(int micro_sec)
  1138. {
  1139. int ms = micro_sec/1000;
  1140. rt_thread_delay(ms);
  1141. }
  1142. void sleep(int sec)
  1143. {
  1144. rt_thread_delay(sec*1000);
  1145. }