2612905 samples, each samples is 0.00004% 29.408 _nkern_schedule 0.00000 305: return scheduler_add(&scheduler, n); 0.00000 306: } 0.00000 307: 0.00000 308: /** Pick a new _nknern_running_task */ 0.00000 309: void _nkern_schedule() 0.93857 310: { 0.00000 311: ////////////////////////////////////////////////// 0.00000 312: // safety checks 0.00000 313: ////////////////////////////////////////////////// 2.79249 314: if (nkern_running_task == NULL) 0.00000 315: nkern_fatal(0x1111); 0.00000 316: 0.00000 317: // test for stack overflow 2.29932 318: if (((uint32_t*) nkern_running_task->stack)[STACK_GUARD_WORD]!=STACK_MAGIC_NUMBER) { 0.28489 319: nkern_fatal(0xF0F3); 0.00000 320: } 0.00000 321: 0.00000 322: // Wake up any eligible sleeping tasks by putting them into their run queue. 1.16755 323: uint64_t now_utime = nkern_utime(); 2.20085 324: uint64_t delta_utime = now_utime - last_schedule_utime; 0.93149 325: last_schedule_utime = now_utime; 2.10061 326: nkern_running_task->usecs_used_current += delta_utime; 0.00000 327: 0.00000 328: ////////////////////////////////////////////////// 0.00000 329: // put the current task away. 0.00000 330: ////////////////////////////////////////////////// 0.30843 331: switch (nkern_running_task->status) 0.00000 332: { 0.00000 333: case NKERN_TASK_BEGIN_WAIT: 0.00000 334: { 0.00000 335: // did a event fire before the user called wait()? 0.00000 336: nkern_wait_t *nw = NULL; 0.00306 337: for (int i = 0; i < nkern_running_task->num_waits; i++) { 0.00027 338: if (nkern_running_task->waits[i].event) { 0.00000 339: nw = &nkern_running_task->waits[i]; 0.00000 340: break; 0.00000 341: } 0.00000 342: } 0.00000 343: 0.00000 344: // if so, clean up and wake the task. 0.00000 345: // otherwise, put the task to sleep. 0.00000 346: if (nw) 0.00000 347: _wake_up_task(nkern_running_task, nw); 0.00000 348: else 0.00172 349: nkern_running_task->status = NKERN_TASK_WAIT; 0.00000 350: break; 0.00000 351: } 0.00000 352: case NKERN_TASK_READY: 4.32086 353: scheduler_add(&scheduler, nkern_running_task); 0.00000 354: break; 0.00000 355: 0.00000 356: case NKERN_TASK_WAIT: 0.00000 357: nkern_fatal(0xf0f5); 0.00000 358: break; 0.00000 359: 0.00000 360: case NKERN_TASK_EXITING: 0.00000 361: _destroy_task(nkern_running_task); 0.00000 362: break; 0.00000 363: 0.00000 364: default: 0.00000 365: nkern_fatal(0xF0F4); 0.00000 366: } 0.00000 367: 0.89180 368: nkern_running_task = NULL; 0.00000 369: 0.00000 370: // now that all processes are refiled into a waitlist, update 0.00000 371: // their accounting information. 3.34666 372: update_accounting(now_utime); 0.00000 373: 0.00000 374: ////////////////////////////////////////////////// 0.00000 375: // wake up sleeping processes if their timer has expired 0.00000 376: ////////////////////////////////////////////////// 0.00000 377: 0.00000 378: nkern_task_t *n; 2.97236 379: while ((n = sleep_queue_remove_head_if_sleep_done(&sleep_queue, now_utime))) { 0.93126 380: _wake_up_task(n, NULL); 0.00000 381: } 0.00000 382: 0.00000 383: ////////////////////////////////////////////////// 0.00000 384: // pick a new task (the one with maximum priority) 0.00000 385: ////////////////////////////////////////////////// 1.11508 386: nkern_running_task = scheduler_pick(&scheduler); 0.00000 387: 0.83505 388: if (!nkern_running_task) 0.00000 389: nkern_fatal(0xF0F5); // no task? where did the idle task go? 0.00000 390: 0.00000 391: // we have a running task 1.56561 392: nkern_running_task->scheduled_count_current++; 0.40017 393: } 0.00000 394: 0.00000 395: uint32_t _nkern_wake_one(nkern_wait_list_t *wl) 0.00000 396: { 0.00000 397: nkern_wait_t *w = _nkern_wait_list_remove_first(wl); 0.00000 398: 15.136 nkern_utime 0.00000 47: ILR = ILR; // clear all RTC-related interrupts 0.00000 48: VICVectAddr = 0; 0.00000 49: } 0.00000 50: 0.00000 51: uint64_t nkern_utime() 1.25083 52: { 0.00000 53: irqstate_t flags; 0.75276 54: disable_interrupts(&flags); 0.00000 55: 0.00000 56: 0.00000 57: // LPC2378 DOCUMENTATION BUG: 0.00000 58: // CTC counts twice as fast as documented, 65 kHz. 0.00000 59: // Fortunately all low 16 bits seem to be valid. 1.24788 60: uint32_t ctc = CTC & 0xffff; 3.94519 61: uint32_t ctime0 = CTIME0 & 0x3f; 0.00000 62: 4.84162 63: if (ctime0 != last_ctime0) { 0.00000 64: last_ctime0 = ctime0; 0.00004 65: utime_base += 1000000; 0.00000 66: 0.00008 67: ctc = CTC & 0xffff; 0.00000 68: } 0.00000 69: 0.55100 70: uint64_t utime = utime_base; 0.00000 71: 2.17708 72: enable_interrupts(&flags); 0.00000 73: 0.00000 74: // approximate 1000000/65536 = 15.2587890625 as 15.25 0.00000 75: // utime += ctc*15 + ctc/4; 0.00000 76: utime += ctc*15 + (ctc>>2) + (ctc>>7); 0.00000 77: return utime; 0.36955 78: } 0.00000 79: 0.00000 80: static void rtc_irq(void) __attribute__ ((naked)); 0.00000 81: static void rtc_irq(void) 0.00000 82: { 0.00000 83: IRQ_TASK_SAVE; 13.458 _userspace_reschedule 0.00000 19: } 0.00000 20: 0.00000 21: void _userspace_reschedule(void) __attribute__ ((naked)); 0.00000 22: void _userspace_reschedule() 0.00000 23: { 5.62294 24: asm volatile("ldr r0, =nkern_running_task \r\n\t" \ 0.00000 25: "ldr r0, [r0] \r\n\t" \ 0.00000 26: "stmia r0, {r0 - r14} \r\n\t" \ 0.00000 27: "add r0, r0, #60 \r\n\t" \ 0.00000 28: "add lr, lr, #4 \r\n\t" \ 0.00000 29: "mrs r1, cpsr \r\n\t" \ 0.00000 30: "stmia r0, {r1, lr} \r\n\t" \ 0.00000 31: "msr cpsr_c, #0x92 \r\n\t"); 0.00000 32: 0.00253 33: _nkern_schedule(); 0.00000 34: 7.83236 35: IRQ_TASK_RESTORE; 0.00000 36: } 0.00000 37: 0.00000 38: /** This is used to launch the idle process as the very first process 0.00000 39: in the system; all you need to do is simulate the IRQ_TASK_SAVE 0.00000 40: (which is a NOP, since the state has been filled in by 12.543 scheduler_pick 0.00000 41: 0.00000 42: return n->priority > nkern_running_task->priority; 0.00000 43: } 0.00000 44: 0.00000 45: nkern_task_t *scheduler_pick(scheduler_t *s) 1.62164 46: { 2.86436 47: for (int pri = NKERN_NPRIORITIES - 1; pri >= 0; pri--) { 0.00000 48: 2.22048 49: nkern_task_t *n = s->head[pri]; 0.00000 50: 2.58184 51: if (!n) 0.00000 52: continue; 0.00000 53: 1.43897 54: s->head[pri] = n->scheduler_next; 0.00000 55: 0.00000 56: // list now empty? (fix tail pointer) 0.53079 57: if (s->head[pri] == NULL) 0.00023 58: s->tail[pri] = NULL; 0.00000 59: 0.41310 60: n->scheduler_next = NULL; 0.87144 61: s->runnable_tasks--; 0.00000 62: return n; 0.00000 63: } 0.00000 64: 0.00000 65: return NULL; 0.00000 66: } 7.466 scheduler_add 0.00000 20: s->runnable_tasks = 0; 0.00000 21: } 0.00000 22: 0.00000 23: // add the process to the tail of the appropriate priority list 0.00000 24: int scheduler_add(scheduler_t *s, nkern_task_t *n) 1.53025 25: { 0.44770 26: uint32_t pri = n->priority; 0.00000 27: 0.32041 28: if (s->head[pri] == NULL) { 0.00000 29: // empty list? 0.48624 30: s->head[pri] = n; 0.00000 31: s->tail[pri] = n; 0.13028 32: n->scheduler_next = NULL; 0.00000 33: } else { 0.00000 34: // append 0.64335 35: s->tail[pri]->scheduler_next = n; 0.00031 36: s->tail[pri]= n; 0.00077 37: n->scheduler_next = NULL; 0.00000 38: } 0.00000 39: 2.64051 40: s->runnable_tasks ++; 0.00000 41: 0.00000 42: return n->priority > nkern_running_task->priority; 1.26591 43: } 0.00000 44: 0.00000 45: nkern_task_t *scheduler_pick(scheduler_t *s) 0.00000 46: { 0.00000 47: for (int pri = NKERN_NPRIORITIES - 1; pri >= 0; pri--) { 0.00000 48: 5.724 nkern_yield 0.00000 179: } 0.00000 180: 0.00000 181: void nkern_dump_state(nkern_task_t *task); 0.00000 182: 0.00000 183: void nkern_yield() 1.94626 184: { 0.00000 185: irqstate_t flags; 1.02246 186: disable_interrupts(&flags); 0.00000 187: 1.14015 188: if (nkern_in_irq()) 0.92124 189: nkern_fatal(0xf101); 0.00000 190: 0.00417 191: _userspace_reschedule(); 0.00000 192: 0.68606 193: enable_interrupts(&flags); 0.00341 194: } 0.00000 195: 0.00000 196: int nkern_init_wait_event(nkern_wait_t *wr, nkern_wait_list_t *wl) 0.00000 197: { 0.00000 198: wr->task = nkern_running_task; 0.00000 199: wr->list = wl; 4.404 sleep_queue_remove_head_if_sleep_done 0.00000 35: n->sleep_next = *p; 0.00000 36: *p = n; 0.00000 37: } 0.00000 38: 0.00000 39: nkern_task_t *sleep_queue_remove_head_if_sleep_done(sleep_queue_t *sq, uint64_t utime) 0.86429 40: { 0.00015 41: nkern_task_t *n = sq->head; 0.00000 42: 3.53855 43: if (n == NULL || n->wait_utime > utime) 0.00000 44: return NULL; 0.00000 45: 0.00031 46: sq->head = n->sleep_next; 0.00069 47: n->sleep_next = NULL; 0.00000 48: return n; 0.00000 49: } 0.00000 50: 0.00000 51: 0.00000 52: 3.347 update_accounting 0.00000 245: static uint64_t last_accounting_utime_interval; // how long the last accounting period was 0.00000 246: static uint64_t next_accounting_utime; // when to do the next accounting 0.00000 247: 0.00000 248: static inline void update_accounting(uint64_t now_utime) 0.00000 249: { 3.34540 250: if (now_utime < next_accounting_utime) 0.00000 251: return; 0.00000 252: 0.00000 253: // cpu utilization per process 0.00000 254: uint64_t elapsed_utime = now_utime - last_accounting_utime; 0.00011 255: last_accounting_utime_interval = elapsed_utime; 0.00000 256: 0.00000 257: last_accounting_utime = now_utime; 0.00000 258: next_accounting_utime = now_utime + ACCOUNTING_UPDATE_USECS; 0.00000 259: 0.00019 260: for (nkern_task_t *n = tasks_head; n != NULL; n = n->next) { 0.00000 261: 0.00038 262: n->usecs_used_last = n->usecs_used_current; 0.00000 263: n->usecs_used_current = 0; 0.00000 264: // fixed point math for better precision (* 128) 0.00019 265: n->scheduled_count_last = n->scheduled_count_current * 0.00000 266: (128 * 1000000 / ACCOUNTING_UPDATE_USECS) / 128; 0.00004 267: n->scheduled_count_current = 0; 0.00000 268: } 0.00000 269: 0.00000 270: // load average 0.00000 271: if (load_counter) { 0.00023 272: load_average[0] = load_accumulator*1000 / load_counter; 0.00000 273: } 0.00000 274: 0.00000 275: // the "8" is to cause the correct rounding. 0.00008 276: load_average[1] = (load_average[1]*15 + load_average[0] + 8)/16; 0.00004 277: load_average[2] = (load_average[2]*15 + load_average[1] + 8)/16; 0.00000 278: } 0.00000 279: 0.00000 280: void _nkern_periodic() 0.00000 281: { 0.00000 282: load_accumulator += scheduler_runnable_tasks(&scheduler); 2.871 enable_interrupts 0.00000 32: } 0.00000 33: 0.00000 34: // restore IRQ/FIQ state 0.00000 35: static inline void enable_interrupts(irqstate_t *stateptr) 0.00000 36: { 2.87071 37: asm volatile ("ldr ip, [%0] \r\n" 0.00000 38: "msr CPSR_c, ip \r\n" 0.00000 39: : 0.00000 40: : 0.00000 41: "r"(stateptr) 0.00000 42: : "ip" 1.958 nkern_idle 0.00000 60: 0.00000 61: while(1) { 0.00000 62: // idle thread can never sleep but yielding is a good 0.00000 63: // idea; it can allow another sleeping task to wake up 0.00000 64: // with less latency than wasting our whole quantum 1.95813 65: nkern_yield(); 0.00000 66: } 0.00000 67: } 0.00000 68: 0.00000 69: const char* const prioritynames[] = {"pri0", "pri1", "pri2", "pri3", "pri4", "pri5", "pri6"}; 0.00000 70: 1.779 disable_interrupts 0.00000 17: 0.00000 18: // disable IRQs 0.00000 19: static inline void disable_interrupts(irqstate_t *stateptr) 0.00000 20: { 0.00000 21: // disable interrupts, preserving the current operating mode 1.77948 22: asm volatile ("mrs ip, cpsr \r\n" 0.00000 23: "str ip, [%0] \r\n" 0.00000 24: "orr ip, ip, #0x80 \r\n" 0.00000 25: "msr CPSR_c, ip \r\n" 0.00000 26: : 0.00000 27: : 0.930 nkern_in_irq 0.00000 126: #define NKERN_IRQ_ENTER nkern_in_interrupt_flag = 1; 0.00000 127: #define NKERN_IRQ_EXIT nkern_in_interrupt_flag = 0; 0.00000 128: 0.00000 129: static inline uint32_t nkern_in_irq() 0.00000 130: { 0.93042 131: return nkern_in_interrupt_flag; 0.00000 132: } 0.00000 133: 0.00000 134: /*************************************************** 0.00000 135: * Debug tasks 0.00000 136: ***************************************************/ 0.190 charlcd_wait_busy 0.00000 70: 0.00000 71: return stat; 0.00000 72: } 0.00000 73: 0.00000 74: static void charlcd_wait_busy( void ) 0.00505 75: { 0.00000 76: /* Wait until LCD controller (ST7066) is busy. */ 0.00000 77: int timeout = 0; 0.00000 78: while (1) 0.00000 79: { 0.16805 80: int stat = charlcd_read_stat(); 0.00214 81: if (!(stat & 0x80)) 0.00000 82: break; 0.00000 83: 0.00961 84: nkern_yield(); 0.00000 85: 0.00467 86: if (timeout++ > 10) 0.00000 87: return; 0.00000 88: } 0.00000 89: } 0.00000 90: 0.00000 91: static void charlcd_write_cmd(int c) 0.168 charlcd_read_stat 0.00000 47: static int charlcd_read_stat( void ) 0.00000 48: { 0.00000 49: /* Read status of LCD controller (ST7066) */ 0.00000 50: int stat; 0.00000 51: 0.02155 52: IODIR1 &= ~LCD_DATA; 0.00230 53: IOCLR1 = LCD_RS; 0.01604 54: IOSET1 = LCD_RW; 0.03544 55: nsleep(30); // Tas 0.00000 56: IOSET1 = LCD_E; 0.01841 57: nsleep(100); // Tddr 0.00000 58: stat = (IOPIN1 >> 20) & 0xF0; 0.01600 59: IOCLR1 = LCD_E; 0.02063 60: nsleep(10); // hold time 0.00000 61: 0.00000 62: // I thought maybe we could skip reading the low 4 bits, since 0.00000 63: // we're usually only interested in the busy flag, but this 0.00000 64: // doesn't work. 0.00000 65: nsleep(260); // cycle time 0.00249 66: IOSET1 = LCD_E; 0.01891 67: nsleep(100); // Tddr 0.00000 68: stat |= (IOPIN1 >> 24) & 0xF; 0.01630 69: IOCLR1 = LCD_E; 0.00000 70: 0.00000 71: return stat; 0.00000 72: } 0.00000 73: 0.00000 74: static void charlcd_wait_busy( void ) 0.151 rtc_irq_real 0.00000 28: return utime_base; 0.00000 29: } 0.00000 30: */ 0.00000 31: static void rtc_irq_real(void) __attribute__ ((noinline)); 0.00000 32: static void rtc_irq_real() 0.00344 33: { 0.01994 34: rtc_ticks++; 0.00279 35: FIO2PIN = rtc_ticks&0xff; 0.00000 36: 0.00000 37: // entering a new second? 0.00670 38: uint32_t ctime0 = CTIME0 & 0x3f; 0.02828 39: if (ctime0 != last_ctime0) { 0.00000 40: last_ctime0 = ctime0; 0.00582 41: utime_base += 1000000; 0.00000 42: } 0.00000 43: 0.00524 44: _nkern_periodic(); 0.01489 45: _nkern_schedule(); 0.00000 46: 0.01837 47: ILR = ILR; // clear all RTC-related interrupts 0.04248 48: VICVectAddr = 0; 0.00344 49: } 0.00000 50: 0.00000 51: uint64_t nkern_utime() 0.00000 52: { 0.00000 53: irqstate_t flags; 0.00000 54: disable_interrupts(&flags); 0.102 rtc_irq 0.00000 78: } 0.00000 79: 0.00000 80: static void rtc_irq(void) __attribute__ ((naked)); 0.00000 81: static void rtc_irq(void) 0.00000 82: { 0.04929 83: IRQ_TASK_SAVE; 0.00563 84: NKERN_IRQ_ENTER; 0.00321 85: rtc_irq_real(); 0.01695 86: NKERN_IRQ_EXIT; 0.02675 87: IRQ_TASK_RESTORE; 0.00000 88: } 0.00000 89: 0.00000 90: void nkern_start_periodic_interrupt() 0.00000 91: { 0.00000 92: /* 0.095 charlcd_write_4bit 0.00000 21: : : : "r0"); } 0.00000 22: 0.00000 23: static void charlcd_write_4bit(int c) 0.00000 24: { 0.00000 25: /* Write a 4-bit command to LCD controller. */ 0.00899 26: IODIR1 |= LCD_DATA | LCD_CTRL; 0.00000 27: IOCLR1 = LCD_RW | LCD_DATA; 0.03119 28: IOSET1 = (c & 0xF) << 24; 0.01305 29: IOSET1 = LCD_E; 0.00000 30: // minimum E pulse width (Tpw) = 150ns 0.02518 31: nsleep(150); 0.00000 32: IOCLR1 = LCD_E; 0.00000 33: 0.00000 34: // hold time 0.01699 35: nsleep(10); 0.00000 36: return; 0.00000 37: } 0.00000 38: 0.00000 39: static void charlcd_write( int c ) 0.00000 40: { 0.030 _nkern_periodic 0.00000 276: load_average[1] = (load_average[1]*15 + load_average[0] + 8)/16; 0.00000 277: load_average[2] = (load_average[2]*15 + load_average[1] + 8)/16; 0.00000 278: } 0.00000 279: 0.00000 280: void _nkern_periodic() 0.00065 281: { 0.02201 282: load_accumulator += scheduler_runnable_tasks(&scheduler); 0.00685 283: load_counter++; 0.00000 284: } 0.00000 285: 0.00000 286: // Wake up a task that was waiting. The event that triggered the 0.00000 287: // wakeup should be passed in, or NULL if it was a timeout. 0.00000 288: // This function is only called after all wait lists have been set up 0.026 charlcd_putc 0.00000 167: 0.00000 168: charlcd_goto(0, y_pos); 0.00000 169: } 0.00000 170: 0.00000 171: void charlcd_putc( char c ) 0.00264 172: { 0.00153 173: nkern_mutex_lock(&iomutex); 0.00000 174: 0.00283 175: if (c=='\n' || c=='\r') { 0.00088 176: clear_line(); 0.00034 177: scroll_pending = 1; 0.00000 178: 0.00000 179: goto done; 0.00000 180: } 0.00000 181: 0.00823 182: if (scroll_pending || x_pos == width) { 0.00031 183: scroll(); 0.00004 184: scroll_pending = 0; 0.00000 185: } 0.00000 186: 0.00191 187: charlcd_putc_raw(c); 0.00318 188: x_pos ++; 0.00000 189: 0.00000 190: done: 0.00188 191: nkern_mutex_unlock(&iomutex); 0.00000 192: return; 0.00199 193: } 0.00000 194: 0.00000 195: void charlcd_puts(const char *s) 0.00000 196: { 0.00000 197: while (*s) { 0.00000 198: charlcd_putc(*s); 0.021 charlcd_putc_raw 0.00000 138: { 0.00000 139: charlcd_write_cmd(0x0c); 0.00000 140: } 0.00000 141: 0.00000 142: static void charlcd_putc_raw(char c) 0.00299 143: { 0.01661 144: charlcd_write_data(c); 0.00111 145: } 0.00000 146: 0.00000 147: static void clear_line() 0.00000 148: { 0.00000 149: // clear the rest of this line 0.00000 150: for (int i = x_pos; i < width; i++) 0.017 charlcd_write_data 0.00000 96: } 0.00000 97: 0.00000 98: static void charlcd_write_data(int d) 0.00000 99: { 0.00000 100: /* Write data to LCD controller. */ 0.00008 101: charlcd_wait_busy(); 0.00972 102: IOSET1 = LCD_RS; 0.00681 103: charlcd_write(d); 0.00000 104: } 0.00000 105: 0.00000 106: // zero-indexed. 0.00000 107: void charlcd_goto(int x, int y) 0.00000 108: { 0.016 pprintf 0.00000 124: for (int i = len; i < width; i++) 0.00000 125: putc(' '); 0.00000 126: } 0.00000 127: 0.00000 128: void pprintf(void (*putc)(char c), const char *fmt, ...) 0.00073 129: { 0.00000 130: int leadingzero; 0.00000 131: int leftadjust; 0.00000 132: int precision; 0.00000 133: int width; 0.00000 134: 0.00000 135: va_list ap; 0.00000 136: 0.00019 137: va_start(ap, fmt); 0.00000 138: 0.00379 139: while (*fmt) 0.00000 140: { 0.00069 141: switch(*fmt) 0.00000 142: { 0.00000 143: case '%': 0.00050 144: fmt++; 0.00000 145: 0.00000 146: // parse flag characters 0.00000 147: leadingzero = 0; 0.00000 148: leftadjust = 0; 0.00000 149: while (1) 0.00000 150: { 0.00038 151: if (*fmt=='0') { 0.00000 152: leadingzero = 1; 0.00015 153: fmt++; 0.00000 154: continue; 0.00000 155: } 0.00000 156: if (*fmt=='-') { 0.00000 157: leftadjust = 1; 0.00000 158: fmt++; 0.00011 159: continue; 0.00000 160: } 0.00000 161: break; 0.00000 162: } 0.00000 163: 0.00000 164: // consume a width formatter 0.00000 165: width = 0; 0.00000 166: while (1) { 0.00096 167: if (isdigit(*fmt)) { 0.00011 168: width = width*10 + *fmt-'0'; 0.00000 169: fmt++; 0.00000 170: continue; 0.00000 171: } 0.00000 172: break; 0.00000 173: } 0.00000 174: 0.00000 175: // consume precision 0.00000 176: precision = 0; 0.00034 177: if (*fmt=='.') { 0.00000 178: fmt++; 0.00000 179: while (1) { 0.00000 180: if (isdigit(*fmt)) { 0.00000 181: precision = precision*10 + *fmt-'0'; 0.00000 182: fmt++; 0.00000 183: continue; 0.00000 184: } 0.00000 185: } 0.00000 186: } 0.00000 187: 0.00000 188: // consume length specifiers (we ignore them) 0.00015 189: while (*fmt=='l' || *fmt=='L') 0.00000 190: fmt++; 0.00000 191: 0.00000 192: // here's the format specifier, finally. 0.00019 193: switch (*fmt) 0.00000 194: { 0.00000 195: case 'b': 0.00000 196: pprintf_binary(putc, width, leadingzero, leftadjust, va_arg(ap, int)); 0.00000 197: break; 0.00000 198: case 'i': 0.00000 199: case 'd': 0.00513 200: pprintf_decimal(putc, width, leadingzero, leftadjust, va_arg(ap, int)); 0.00000 201: break; 0.00000 202: case 'u': 0.00027 203: pprintf_unsigned_decimal(putc, width, leadingzero, leftadjust, va_arg(ap, int)); 0.00000 204: break; 0.00000 205: case 'x': 0.00000 206: case 'X': 0.00000 207: case 'p': 0.00000 208: pprintf_hexidecimal(putc, width, leadingzero, leftadjust, va_arg(ap, int32_t)); 0.00000 209: break; 0.00000 210: case 's': 0.00000 211: pprintf_string(putc, width, leftadjust, va_arg(ap, char*)); 0.00000 212: break; 0.00000 213: case 'c': 0.00000 214: putc(va_arg(ap, int)); 0.00000 215: break; 0.00000 216: case '%': 0.00000 217: putc('%'); 0.00000 218: break; 0.00000 219: case 'f': 0.00000 220: putc('('); 0.00000 221: putc('d'); 0.00000 222: putc('b'); 0.00000 223: putc('l'); 0.00000 224: putc(')'); 0.00000 225: (void) va_arg(ap, double); 0.00000 226: } 0.00031 227: fmt++; 0.00000 228: break; 0.00000 229: 0.00000 230: default: 0.00073 231: putc(*fmt); 0.00038 232: fmt++; 0.00000 233: break; 0.00000 234: } 0.00000 235: } 0.00000 236: 0.00000 237: va_end(ap); 0.00042 238: } 0.00000 239: 0.00000 240: 0.00000 241: 0.00000 242: 0.00000 243: 0.014 nkern_mutex_lock 0.00000 7: m->lockcount = 0; 0.00000 8: nkern_wait_list_init(&m->waitlist, name); 0.00000 9: } 0.00000 10: 0.00000 11: void nkern_mutex_lock(nkern_mutex_t *m) 0.00367 12: { 0.00000 13: irqstate_t flags; 0.00000 14: 0.00145 15: disable_interrupts(&flags); 0.00000 16: 0.00000 17: while (1) { 0.00000 18: // lock unclaimed? 0.00119 19: if (m->owner == NULL) { 0.00088 20: m->owner = nkern_running_task; 0.00142 21: m->lockcount = 1; 0.00000 22: break; 0.00000 23: } 0.00000 24: 0.00000 25: // lock already owned? 0.00042 26: if (m->owner == nkern_running_task) { 0.00325 27: m->lockcount++; 0.00000 28: break; 0.00000 29: } 0.00000 30: 0.00000 31: // lock is owned by someone else. 0.00000 32: nkern_wait(&m->waitlist); 0.00000 33: } 0.00000 34: 0.00168 35: enable_interrupts(&flags); 0.00019 36: } 0.00000 37: 0.00000 38: uint32_t nkern_mutex_unlock(nkern_mutex_t *m) 0.00000 39: { 0.00000 40: irqstate_t flags; 0.00000 41: int reschedule = 0; 0.013 nkern_mutex_unlock 0.00000 34: 0.00000 35: enable_interrupts(&flags); 0.00000 36: } 0.00000 37: 0.00000 38: uint32_t nkern_mutex_unlock(nkern_mutex_t *m) 0.00276 39: { 0.00000 40: irqstate_t flags; 0.00000 41: int reschedule = 0; 0.00000 42: 0.00126 43: disable_interrupts(&flags); 0.00000 44: 0.00226 45: m->lockcount--; 0.00004 46: if (m->lockcount != 0) { 0.00000 47: goto done; 0.00000 48: } 0.00000 49: 0.00000 50: // mutex is now really unlocked. 0.00077 51: m->owner = NULL; 0.00000 52: 0.00000 53: // someone wants this mutex 0.00000 54: // wake up the waiting tasks 0.00268 55: if (_nkern_wake_one(&m->waitlist)) 0.00000 56: nkern_yield(); 0.00000 57: 0.00000 58: done: 0.00203 59: enable_interrupts(&flags); 0.00000 60: return reschedule; 0.00084 61: } 0.00000 62: 0.00000 63: 0.00000 64: 0.00000 65: 0.00000 66: 0.011 _wake_up_task 0.00000 286: // Wake up a task that was waiting. The event that triggered the 0.00000 287: // wakeup should be passed in, or NULL if it was a timeout. 0.00000 288: // This function is only called after all wait lists have been set up 0.00000 289: // and the user task has called wait(). 0.00000 290: static int _wake_up_task(nkern_task_t *n, nkern_wait_t *w) 0.00031 291: { 0.00153 292: if (w) 0.00115 293: n->wait_index = w - n->waits; 0.00000 294: else 0.00011 295: n->wait_index = -1; 0.00000 296: 0.00107 297: for (int i = 0; i < n->num_waits; i++) { 0.00027 298: _nkern_wait_list_remove(n->waits[i].list, &n->waits[i]); 0.00000 299: } 0.00000 300: 0.00302 301: if (n->wait_utime) 0.00084 302: sleep_queue_remove(&sleep_queue, n); 0.00000 303: 0.00103 304: n->status = NKERN_TASK_READY; 0.00153 305: return scheduler_add(&scheduler, n); 0.00054 306: } 0.00000 307: 0.00000 308: /** Pick a new _nknern_running_task */ 0.00000 309: void _nkern_schedule() 0.00000 310: { 0.00000 311: ////////////////////////////////////////////////// 0.011 serial_write 0.00000 58: 0.00000 59: return UxPORT(port, UxRBR_OFFSET); 0.00000 60: } 0.00000 61: 0.00000 62: long serial_write(void *user, const void *data, int len) 0.00069 63: { 0.00000 64: int port = (int) user; 0.00000 65: irqstate_t state; 0.00054 66: disable_interrupts(&state); 0.00000 67: 0.00015 68: for (int i = 0; i < len; i++) 0.00000 69: { 0.00000 70: // re-enable write interrupts 0.00180 71: UxPORT(port, UxIER_OFFSET) |= (1<<1); 0.00000 72: 0.00455 73: while (!(UxPORT(port, UxLSR_OFFSET) & 0x20)) { 0.00134 74: nkern_wait(&tx_waitlist[port]); 0.00000 75: } 0.00000 76: 0.00046 77: UxPORT(port, UxTHR_OFFSET) = ((char*) data)[i]; 0.00000 78: } 0.00000 79: 0.00111 80: enable_interrupts(&state); 0.00000 81: 0.00000 82: return len; 0.00023 83: } 0.00000 84: 0.00000 85: long serial_read(void *user, void *data, int len) 0.00000 86: { 0.00000 87: int port = (int) user; 0.00000 88: irqstate_t state; 0.010 read_phy 0.00000 210: } 0.00000 211: } 0.00000 212: } 0.00000 213: 0.00000 214: static uint32_t read_phy( uint32_t reg ) 0.00008 215: { 0.00004 216: MAC_MADR = DP83848C_DEF_ADR | reg; /* [12:8] == PHY addr, [4:0]=0x00(BMCR) register addr */ 0.00000 217: MAC_MCMD = MCMD_READ; 0.00000 218: 0.00455 219: for (int tout = 0; tout < MII_RD_TOUT; tout++) { 0.00563 220: if ((MAC_MIND & MIND_BUSY) == 0) { 0.00000 221: break; 0.00000 222: } 0.00000 223: } 0.00000 224: 0.00000 225: MAC_MCMD = 0; 0.00000 226: return MAC_MRDD; 0.00008 227: } 0.00000 228: 0.00000 229: eth_dev_t *emac_getdev() 0.00000 230: { 0.00000 231: return ðdev; 0.00000 232: } 0.010 nkern_wait_many_until 0.00000 219: } 0.00000 220: 0.00000 221: // This is the mother-of-all wait methods; all other sleep and wait 0.00000 222: // methods are implemented in terms of it. 0.00000 223: int nkern_wait_many_until(nkern_wait_t *waits, int num_waits, uint64_t utime) 0.00172 224: { 0.00000 225: irqstate_t flags; 0.00061 226: disable_interrupts(&flags); 0.00000 227: 0.00168 228: nkern_running_task->waits = waits; 0.00057 229: nkern_running_task->num_waits = num_waits; 0.00031 230: nkern_running_task->status = NKERN_TASK_BEGIN_WAIT; 0.00008 231: nkern_running_task->wait_utime = utime; 0.00000 232: 0.00027 233: if (utime) 0.00103 234: sleep_queue_insert_ascending_waketime(&sleep_queue, nkern_running_task); 0.00000 235: 0.00061 236: nkern_yield(); 0.00000 237: 0.00230 238: enable_interrupts(&flags); 0.00000 239: 0.00000 240: return nkern_running_task->wait_index; 0.00107 241: } 0.00000 242: 0.00000 243: static uint64_t last_schedule_utime; 0.00000 244: static uint64_t last_accounting_utime; // time of last accounting 0.00000 245: static uint64_t last_accounting_utime_interval; // how long the last accounting period was 0.00000 246: static uint64_t next_accounting_utime; // when to do the next accounting 0.008 serial_irq_real 0.00000 128: } 0.00000 129: 0.00000 130: static void serial_irq_real(void) __attribute__ ((noinline)); 0.00000 131: static void serial_irq_real() 0.00000 132: { 0.00027 133: uint32_t irq_flags = VICIRQStatus; 0.00000 134: int port; 0.00000 135: 0.00023 136: if (irq_flags & (1<<6)) 0.00000 137: port = 0; 0.00019 138: else if (irq_flags & (1<<7)) 0.00000 139: port = 1; 0.00000 140: else if (irq_flags & (1<<28)) 0.00000 141: port = 2; 0.00000 142: else if (irq_flags & (1<<29)) 0.00000 143: port = 3; 0.00000 144: else 0.00023 145: return; 0.00000 146: 0.00000 147: int event = UxPORT(port, UxIIR_OFFSET); // what irq occurred? (this clears the interrupt too.) 0.00000 148: int reschedule = 0; 0.00000 149: 0.00103 150: switch(event & 0x0f) 0.00000 151: { 0.00000 152: case 4: // receive data available 0.00000 153: case 12: // character time-out indicator 0.00000 154: reschedule |= _nkern_wake_all(&rx_waitlist[port]); 0.00000 155: UxPORT(port, UxIER_OFFSET) &= ~(1<<0); // disable further read interrupts 0.00000 156: break; 0.00000 157: 0.00000 158: case 2: // THRE 0.00054 159: reschedule |= _nkern_wake_all(&tx_waitlist[port]); 0.00295 160: UxPORT(port, UxIER_OFFSET) &= ~(1<<1); // disable further write interrupts 0.00000 161: break; 0.00000 162: 0.00000 163: case 6: // receive line status 0.00000 164: UxPORT(port, UxIER_OFFSET) &= ~(1<<2); // We dont' do anything here 0.00000 165: break; 0.00000 166: 0.00000 167: case 0: // nothing 0.00000 168: default: 0.00000 169: break; 0.00000 170: } 0.00000 171: 0.00142 172: VICVectAddr = 0; 0.00000 173: 0.00004 174: if (reschedule) 0.00023 175: _nkern_schedule(); 0.00000 176: 0.00050 177: } 0.00000 178: 0.00000 179: void serial_irq(void) __attribute__ ((naked)); 0.00000 180: void serial_irq(void) 0.00000 181: { 0.00000 182: IRQ_TASK_SAVE; 0.007 scheduler_runnable_tasks 0.00000 67: 0.00000 68: // how many runnable tasks? 0.00000 69: int scheduler_runnable_tasks(scheduler_t *s) 0.00000 70: { 0.00000 71: return s->runnable_tasks; 0.00704 72: } 0.00000 73: 0.00000 74: 0.00000 75: 0.00000 76: 0.00000 77: 0.007 sleep_queue_insert_ascending_waketime 0.00000 24: } 0.00000 25: } 0.00000 26: 0.00000 27: // insert the task into the sleep queue according to its wait_utime 0.00000 28: void sleep_queue_insert_ascending_waketime(sleep_queue_t *sq, nkern_task_t *n) 0.00073 29: { 0.00000 30: nkern_task_t **p = &sq->head; 0.00524 31: while ((*p)!=NULL && n->wait_utime > (*p)->wait_utime) { 0.00008 32: p = &(*p)->sleep_next; 0.00000 33: } 0.00000 34: 0.00004 35: n->sleep_next = *p; 0.00004 36: *p = n; 0.00042 37: } 0.00000 38: 0.00000 39: nkern_task_t *sleep_queue_remove_head_if_sleep_done(sleep_queue_t *sq, uint64_t utime) 0.00000 40: { 0.00000 41: nkern_task_t *n = sq->head; 0.00000 42: 0.007 nkern_wait_until 0.00000 206: 0.00000 207: return 0; 0.00000 208: } 0.00000 209: 0.00000 210: int nkern_wait_until(nkern_wait_list_t *wl, uint64_t utime) 0.00134 211: { 0.00100 212: if (!wl) 0.00096 213: return nkern_wait_many_until(NULL, 0, utime); 0.00000 214: 0.00000 215: nkern_wait_t waits[1]; 0.00000 216: 0.00046 217: nkern_init_wait_event(&waits[0], wl); 0.00069 218: return nkern_wait_many_until(waits, 1, utime); 0.00207 219: } 0.00000 220: 0.00000 221: // This is the mother-of-all wait methods; all other sleep and wait 0.00000 222: // methods are implemented in terms of it. 0.00000 223: int nkern_wait_many_until(nkern_wait_t *waits, int num_waits, uint64_t utime) 0.00000 224: { 0.006 _nkern_wake_one 0.00000 391: // we have a running task 0.00000 392: nkern_running_task->scheduled_count_current++; 0.00000 393: } 0.00000 394: 0.00000 395: uint32_t _nkern_wake_one(nkern_wait_list_t *wl) 0.00100 396: { 0.00107 397: nkern_wait_t *w = _nkern_wait_list_remove_first(wl); 0.00000 398: 0.00165 399: if (w) { 0.00008 400: w->event = 1; 0.00000 401: // if the task is not yet waiting (they may have started 0.00000 402: // setting up their wait list but haven't called wait() yet), 0.00000 403: // we do not wake up the thread yet because we don't yet have 0.00000 404: // the whole list of wait lists that the user task is 0.00000 405: // subscribing to. nkern_schedule() detects if an event has 0.00000 406: // fired before wait() is called. 0.00015 407: if (w->task->status == NKERN_TASK_WAIT) 0.00011 408: return _wake_up_task(w->task, w); 0.00000 409: } 0.00000 410: 0.00000 411: return 0; 0.00184 412: } 0.00000 413: 0.00000 414: /** returns the highest priority that was woken up **/ 0.00000 415: uint32_t _nkern_wake_all(nkern_wait_list_t *wl) 0.00000 416: { 0.00000 417: uint32_t reschedule = 0; 0.005 charlcd_write 0.00000 35: nsleep(10); 0.00000 36: return; 0.00000 37: } 0.00000 38: 0.00000 39: static void charlcd_write( int c ) 0.00237 40: { 0.00000 41: /* Write data/command to LCD controller. */ 0.00065 42: charlcd_write_4bit (c >> 4); 0.00245 43: charlcd_write_4bit (c); 0.00000 44: return; 0.00000 45: } 0.00000 46: 0.00000 47: static int charlcd_read_stat( void ) 0.00000 48: { 0.005 _vectors 0.00000 21: ldr PC, und_addr /* undefined instruction */ 0.00000 22: ldr PC, swi_addr /* software interrupt */ 0.00000 23: ldr PC, PAbt_Addr /* prefetch abort */ 0.00000 24: ldr PC, DAbt_Addr /* data abort */ 0.00000 25: nop /* lpc checksum will be inserted here */ 0.00524 26: ldr PC, [PC, # - 0x0120] /* irq interrupt, autovectoring via AIC */ 0.00000 27: ldr PC, fiq_addr /* fast interrupt */ 0.00000 28: 0.00000 29: reset_addr: .word reset /* defined in this module below */ 0.00000 30: und_addr: .word exception_und /* defined in main.c */ 0.00000 31: swi_addr: .word exception_swi /* defined in main.c */ 0.005 serial_irq 0.00000 177: } 0.00000 178: 0.00000 179: void serial_irq(void) __attribute__ ((naked)); 0.00000 180: void serial_irq(void) 0.00000 181: { 0.00226 182: IRQ_TASK_SAVE; 0.00019 183: NKERN_IRQ_ENTER; 0.00011 184: serial_irq_real(); 0.00065 185: NKERN_IRQ_EXIT; 0.00153 186: IRQ_TASK_RESTORE; 0.00000 187: } 0.00000 188: 0.00000 189: /** Convenience functions **/ 0.00000 190: void serial_putc(int port, char c) 0.00000 191: { 0.005 pprintf_decimal 0.00000 8: { 0.00000 9: char pprintf_tmp[64]; 0.00000 10: int len = 0; 0.00000 11: int negative; 0.00000 12: 0.00034 13: if (v < 0) { 0.00000 14: negative = 1; 0.00019 15: v = -v; 0.00000 16: } else { 0.00000 17: negative = 0; 0.00000 18: } 0.00000 19: 0.00000 20: do { 0.00107 21: int tv = v%10; 0.00000 22: v=v/10; 0.00023 23: pprintf_tmp[len++]=tv+'0'; 0.00019 24: } while (v>0 || (leadingzero && len < width - negative)); 0.00000 25: 0.00004 26: if (negative) 0.00019 27: pprintf_tmp[len++]='-'; 0.00000 28: 0.00015 29: if (width > 0 && !leftadjust) 0.00073 30: for (int i = len ; i < width; i++) 0.00031 31: putc(' '); 0.00000 32: 0.00073 33: for (int i = len-1; i >= 0; i--) 0.00031 34: putc(pprintf_tmp[i]); 0.00000 35: 0.00015 36: if (width > 0 && leftadjust) 0.00000 37: for (int i = len ; i < width; i++) 0.00000 38: putc(' '); 0.00000 39: } 0.00000 40: 0.00000 41: static inline void pprintf_unsigned_decimal(void (*putc)(char c), int width, int leadingzero, int leftadjust, unsigned int v) 0.004 sleep_queue_remove 0.00000 10: // doubly-linked. 0.00000 11: void sleep_queue_remove(sleep_queue_t *sq, nkern_task_t *n) 0.00000 12: { 0.00000 13: nkern_task_t **p = &sq->head; 0.00000 14: 0.00207 15: while (*p) { 0.00107 16: if ((*p) == n) { 0.00000 17: (*p) = n->sleep_next; 0.00000 18: 0.00011 19: n->sleep_next = NULL; 0.00000 20: return; 0.00000 21: } 0.00000 22: 0.00103 23: p = &((*p)->sleep_next); 0.00000 24: } 0.00000 25: } 0.00000 26: 0.00000 27: // insert the task into the sleep queue according to its wait_utime 0.00000 28: void sleep_queue_insert_ascending_waketime(sleep_queue_t *sq, nkern_task_t *n) 0.004 initthread 0.00000 492: profile_init(); 0.00000 493: 0.00000 494: while (1) { 0.00000 495: // udp_stream_getc(); 0.00000 496: // nkern_debug(udp_stream_putc); 0.00260 497: nkern_usleep(20000); 0.00145 498: if (profile_out == PROFILE_SAMPLES) { 0.00000 499: for (uint32_t i = 0; i < profile_out; i++) { 0.00000 500: pprintf(udp_stream_putc, "%08x\n", (int) profile_buffer[i]); 0.00000 501: } 0.00000 502: irqstate_t flags; 0.00000 503: disable_all_interrupts(&flags); 0.003 _nkern_wait_list_remove_first 0.00000 30: l->tail = n; 0.00000 31: } 0.00000 32: } 0.00000 33: 0.00000 34: nkern_wait_t *_nkern_wait_list_remove_first(nkern_wait_list_t *l) 0.00122 35: { 0.00069 36: nkern_wait_t *n = l->head; 0.00000 37: 0.00107 38: if (n == NULL) 0.00000 39: return NULL; 0.00000 40: 0.00034 41: l->head = n->next; 0.00000 42: 0.00000 43: // list now empty? 0.00000 44: if (l->head == NULL) 0.00000 45: l->tail = NULL; 0.00000 46: 0.00004 47: n->next = NULL; 0.00000 48: return n; 0.00000 49: } 0.00000 50: 0.00000 51: uint32_t _nkern_wait_list_is_empty(nkern_wait_list_t *l) 0.00000 52: { 0.003 charlcd_write_cmd 0.00000 87: return; 0.00000 88: } 0.00000 89: } 0.00000 90: 0.00000 91: static void charlcd_write_cmd(int c) 0.00034 92: { 0.00000 93: charlcd_wait_busy(); 0.00142 94: IOCLR1 = LCD_RS; 0.00122 95: charlcd_write(c); 0.00000 96: } 0.00000 97: 0.00000 98: static void charlcd_write_data(int d) 0.00000 99: { 0.00000 100: /* Write data to LCD controller. */ 0.003 charlcd_goto 0.00000 103: charlcd_write(d); 0.00000 104: } 0.00000 105: 0.00000 106: // zero-indexed. 0.00000 107: void charlcd_goto(int x, int y) 0.00057 108: { 0.00000 109: nkern_mutex_lock(&iomutex); 0.00000 110: 0.00034 111: int v = y ? 0x40 : 0; 0.00000 112: v+=x; 0.00000 113: 0.00008 114: charlcd_write_cmd(v | 0x80); 0.00000 115: 0.00038 116: x_pos = x; 0.00054 117: y_pos = y; 0.00050 118: scroll_pending = 0; 0.00000 119: 0.00042 120: nkern_mutex_unlock(&iomutex); 0.00000 121: } 0.00000 122: 0.00000 123: void charlcd_clear() 0.00000 124: { 0.00000 125: charlcd_write_cmd (0x01); 0.002 __udivdi3 0.00000 1092: 0.00000 1093: 0.00000 1094: 0.00000 1095: 0.00000 1096: 0.00011 1097: 0.00210 1098: 0.00023 1099: 0.00000 1100: 0.00000 1101: 0.00000 1102: 0.00000 1103: 0.00000 1104: 0.002 _nkern_wake_all 0.00000 411: return 0; 0.00000 412: } 0.00000 413: 0.00000 414: /** returns the highest priority that was woken up **/ 0.00000 415: uint32_t _nkern_wake_all(nkern_wait_list_t *wl) 0.00065 416: { 0.00000 417: uint32_t reschedule = 0; 0.00000 418: 0.00088 419: while (!_nkern_wait_list_is_empty(wl)) { 0.00054 420: reschedule |= _nkern_wake_one(wl); 0.00000 421: } 0.00000 422: 0.00000 423: return reschedule; 0.00008 424: } 0.00000 425: 0.00000 426: /** starting at the bottom of the stack, count how many words match 0.00000 427: * our stack signature. **/ 0.00000 428: static int stack_available(uint32_t *p) 0.00000 429: { 0.002 __udivmoddi4 0.00000 826: 0.00000 827: 0.00000 828: 0.00000 829: 0.00000 830: 0.00004 831: 0.00000 832: 0.00000 833: 0.00000 834: 0.00000 835: 0.00000 836: 0.00000 837: 0.00000 838: 0.00000 839: 0.00000 840: 0.00000 841: 0.00000 842: 0.00000 843: 0.00000 844: 0.00000 845: 0.00000 846: 0.00000 847: 0.00000 848: 0.00000 849: 0.00000 850: 0.00000 851: 0.00000 852: 0.00000 853: 0.00000 854: 0.00000 855: 0.00000 856: 0.00000 857: 0.00000 858: 0.00000 859: 0.00000 860: 0.00000 861: 0.00000 862: 0.00000 863: 0.00000 864: 0.00000 865: 0.00000 866: 0.00000 867: 0.00000 868: 0.00000 869: 0.00000 870: 0.00023 871: 0.00000 872: 0.00011 873: 0.00000 874: 0.00000 875: 0.00000 876: 0.00061 877: 0.00000 878: 0.00000 879: 0.00000 880: 0.00000 881: 0.00000 882: 0.00000 883: 0.00000 884: 0.00008 885: 0.00000 886: 0.00000 887: 0.00000 888: 0.00096 889: 0.00000 890: 0.00000 891: 0.00000 892: 0.00000 893: 0.00000 894: 0.00000 895: 0.00000 896: 0.00000 897: 0.00000 898: 0.00000 899: 0.00000 900: 0.00000 901: 0.00000 902: 0.00000 903: 0.00000 904: 0.00000 905: 0.00000 906: 0.00000 907: 0.00000 908: 0.00000 909: 0.00000 910: 0.00000 911: 0.00000 912: 0.00000 913: 0.00000 914: 0.00000 915: 0.00000 916: 0.00000 917: 0.00000 918: 0.00000 919: 0.00000 920: 0.00000 921: 0.00000 922: 0.00000 923: 0.00000 924: 0.00000 925: 0.00000 926: 0.00000 927: 0.00000 928: 0.00000 929: 0.00000 930: 0.00000 931: 0.00000 932: 0.00000 933: 0.00000 934: 0.00000 935: 0.00000 936: 0.00000 937: 0.00000 938: 0.00000 939: 0.00000 940: 0.00000 941: 0.00000 942: 0.00000 943: 0.00000 944: 0.00000 945: 0.00000 946: 0.00000 947: 0.00000 948: 0.00000 949: 0.00000 950: 0.00000 951: 0.00000 952: 0.00000 953: 0.00000 954: 0.00000 955: 0.00000 956: 0.00000 957: 0.00000 958: 0.00000 959: 0.00000 960: 0.00000 961: 0.00000 962: 0.00000 963: 0.00000 964: 0.00000 965: 0.00000 966: 0.00000 967: 0.00000 968: 0.00000 969: 0.00000 970: 0.00000 971: 0.00000 972: 0.00000 973: 0.00000 974: 0.00000 975: 0.00000 976: 0.00000 977: 0.00000 978: 0.00000 979: 0.00000 980: 0.00000 981: 0.00000 982: 0.00000 983: 0.00000 984: 0.00000 985: 0.00000 986: 0.00000 987: 0.00000 988: 0.00000 989: 0.00000 990: 0.00000 991: 0.00000 992: 0.00000 993: 0.00000 994: 0.00000 995: 0.00000 996: 0.00000 997: 0.00000 998: 0.00000 999: 0.00000 1000: 0.00000 1001: 0.00000 1002: 0.00000 1003: 0.00000 1004: 0.00000 1005: 0.00000 1006: 0.00000 1007: 0.00000 1008: 0.00000 1009: 0.00000 1010: 0.00000 1011: 0.00000 1012: 0.00000 1013: 0.00000 1014: 0.00000 1015: 0.00000 1016: 0.00000 1017: 0.00000 1018: 0.00000 1019: 0.00000 1020: 0.00000 1021: 0.00000 1022: 0.00000 1023: 0.00000 1024: 0.00000 1025: 0.00000 1026: 0.00000 1027: 0.00000 1028: 0.00000 1029: 0.00008 1030: 0.00000 1031: 0.00000 1032: 0.00000 1033: 0.00000 1034: 0.00000 1035: 0.002 __aeabi_uidiv 0.00000 368: 0.00000 369: 0.00000 370: 0.00000 371: 0.00000 372: 0.00138 373: 0.00000 374: 0.00000 375: 0.00000 376: 0.00000 377: 0.00000 378: 0.00000 379: 0.00000 380: 0.00000 381: 0.00000 382: 0.00000 383: 0.00000 384: 0.00000 385: 0.00000 386: 0.00000 387: 0.00000 388: 0.00000 389: 0.00000 390: 0.00000 391: 0.00000 392: 0.00000 393: 0.00000 394: 0.00000 395: 0.00000 396: 0.00000 397: 0.00000 398: 0.00000 399: 0.00000 400: 0.00000 401: 0.00000 402: 0.00000 403: 0.00000 404: 0.00000 405: 0.00000 406: 0.00000 407: 0.00000 408: 0.00000 409: 0.00000 410: 0.00000 411: 0.00000 412: 0.00000 413: 0.00000 414: 0.00000 415: 0.00000 416: 0.00000 417: 0.00000 418: 0.00000 419: 0.00000 420: 0.00000 421: 0.00000 422: 0.00000 423: 0.00000 424: 0.00000 425: 0.00000 426: 0.00000 427: 0.00000 428: 0.00000 429: 0.00000 430: 0.00000 431: 0.00000 432: 0.00000 433: 0.00000 434: 0.00000 435: 0.00000 436: 0.00000 437: 0.00000 438: 0.00000 439: 0.00000 440: 0.00000 441: 0.00000 442: 0.00000 443: 0.00000 444: 0.00000 445: 0.00000 446: 0.00000 447: 0.00000 448: 0.00000 449: 0.00000 450: 0.00000 451: 0.00000 452: 0.00000 453: 0.00000 454: 0.00000 455: 0.00000 456: 0.00000 457: 0.00000 458: 0.00000 459: 0.00000 460: 0.00000 461: 0.00000 462: 0.00000 463: 0.00000 464: 0.00000 465: 0.00000 466: 0.00000 467: 0.00000 468: 0.00000 469: 0.00000 470: 0.00000 471: 0.00000 472: 0.00000 473: 0.00000 474: 0.00000 475: 0.00000 476: 0.00000 477: 0.00000 478: 0.00000 479: 0.00000 480: 0.00000 481: 0.00000 482: 0.00000 483: 0.00000 484: 0.00000 485: 0.00000 486: 0.00000 487: 0.00000 488: 0.00000 489: 0.00000 490: 0.00000 491: 0.00000 492: 0.00000 493: 0.00000 494: 0.00000 495: 0.00000 496: 0.00000 497: 0.00000 498: 0.00000 499: 0.00000 500: 0.00000 501: 0.00000 502: 0.00000 503: 0.00000 504: 0.00000 505: 0.00000 506: 0.00000 507: 0.00000 508: 0.00000 509: 0.00000 510: 0.00000 511: 0.00000 512: 0.00000 513: 0.00000 514: 0.00000 515: 0.00000 516: 0.00000 517: 0.00000 518: 0.00000 519: 0.00000 520: 0.00000 521: 0.00000 522: 0.00000 523: 0.00000 524: 0.00000 525: 0.00000 526: 0.00000 527: 0.00000 528: 0.00000 529: 0.00000 530: 0.00000 531: 0.00000 532: 0.00000 533: 0.00000 534: 0.00000 535: 0.00000 536: 0.00000 537: 0.00000 538: 0.00000 539: 0.00000 540: 0.00000 541: 0.00000 542: 0.00000 543: 0.00000 544: 0.00000 545: 0.00000 546: 0.00000 547: 0.00000 548: 0.00000 549: 0.00000 550: 0.00000 551: 0.00000 552: 0.00000 553: 0.00000 554: 0.00000 555: 0.00000 556: 0.00000 557: 0.00000 558: 0.00000 559: 0.00000 560: 0.00000 561: 0.00000 562: 0.00000 563: 0.00000 564: 0.00000 565: 0.00000 566: 0.00000 567: 0.00000 568: 0.00000 569: 0.00000 570: 0.00000 571: 0.00000 572: 0.00000 573: 0.00000 574: 0.00000 575: 0.00000 576: 0.00000 577: 0.00000 578: 0.00000 579: 0.00000 580: 0.00000 581: 0.00000 582: 0.00000 583: 0.00000 584: 0.00000 585: 0.00000 586: 0.00000 587: 0.00000 588: 0.00000 589: 0.00000 590: 0.00000 591: 0.00000 592: 0.00000 593: 0.00000 594: 0.00000 595: 0.00000 596: 0.00000 597: 0.00000 598: 0.00000 599: 0.00000 600: 0.00000 601: 0.00000 602: 0.00000 603: 0.00000 604: 0.00000 605: 0.00000 606: 0.00000 607: 0.00000 608: 0.00000 609: 0.00000 610: 0.00000 611: 0.00000 612: 0.00000 613: 0.00000 614: 0.00000 615: 0.00000 616: 0.00000 617: 0.00000 618: 0.00000 619: 0.00000 620: 0.00000 621: 0.00000 622: 0.00000 623: 0.00000 624: 0.00000 625: 0.00000 626: 0.00000 627: 0.00000 628: 0.00000 629: 0.00000 630: 0.00000 631: 0.00000 632: 0.00000 633: 0.00000 634: 0.00000 635: 0.00000 636: 0.00000 637: 0.00000 638: 0.00000 639: 0.00000 640: 0.00000 641: 0.00000 642: 0.00000 643: 0.00000 644: 0.00000 645: 0.00000 646: 0.00000 647: 0.00000 648: 0.00000 649: 0.00000 650: 0.00000 651: 0.00000 652: 0.00000 653: 0.00000 654: 0.00000 655: 0.00000 656: 0.00000 657: 0.00000 658: 0.00000 659: 0.00000 660: 0.00000 661: 0.00000 662: 0.00000 663: 0.00000 664: 0.00000 665: 0.00000 666: 0.00000 667: 0.00000 668: 0.00000 669: 0.00000 670: 0.00000 671: 0.00000 672: 0.00000 673: 0.00000 674: 0.00000 675: 0.00000 676: 0.00000 677: 0.00000 678: 0.00000 679: 0.00000 680: 0.00000 681: 0.00000 682: 0.00000 683: 0.00000 684: 0.00000 685: 0.00000 686: 0.00000 687: 0.00000 688: 0.00000 689: 0.00000 690: 0.00000 691: 0.00000 692: 0.00000 693: 0.00000 694: 0.00000 695: 0.00000 696: 0.00000 697: 0.00000 698: 0.00000 699: 0.00000 700: 0.00000 701: 0.00000 702: 0.00000 703: 0.00000 704: 0.00000 705: 0.00000 706: 0.00000 707: 0.00000 708: 0.00000 709: 0.00000 710: 0.00000 711: 0.00000 712: 0.00000 713: 0.00000 714: 0.00000 715: 0.00000 716: 0.00000 717: 0.00000 718: 0.00000 719: 0.00000 720: 0.00000 721: 0.00000 722: 0.00000 723: 0.00000 724: 0.00000 725: 0.00000 726: 0.00000 727: 0.00000 728: 0.00000 729: 0.00015 730: 0.00004 731: 0.00004 732: 0.00008 733: 0.00015 734: 0.00000 735: 0.00000 736: 0.00000 737: 0.00000 738: 0.00000 739: 0.00000 740: 0.00000 741: 0.00000 742: 0.00008 743: 0.00011 744: 0.00000 745: 0.00000 746: 0.00000 747: 0.00000 748: 0.00000 749: 0.002 nkern_init_wait_event 0.00000 192: 0.00000 193: enable_interrupts(&flags); 0.00000 194: } 0.00000 195: 0.00000 196: int nkern_init_wait_event(nkern_wait_t *wr, nkern_wait_list_t *wl) 0.00061 197: { 0.00019 198: wr->task = nkern_running_task; 0.00004 199: wr->list = wl; 0.00000 200: wr->event = 0; 0.00000 201: 0.00000 202: irqstate_t flags; 0.00038 203: disable_interrupts(&flags); 0.00008 204: _nkern_wait_list_append(wl, wr); 0.00042 205: enable_interrupts(&flags); 0.00000 206: 0.00000 207: return 0; 0.00000 208: } 0.00000 209: 0.00000 210: int nkern_wait_until(nkern_wait_list_t *wl, uint64_t utime) 0.002 serial_putc 0.00000 186: IRQ_TASK_RESTORE; 0.00000 187: } 0.00000 188: 0.00000 189: /** Convenience functions **/ 0.00000 190: void serial_putc(int port, char c) 0.00046 191: { 0.00019 192: serial_write((void*) port, &c, 1); 0.00096 193: } 0.00000 194: 0.00000 195: int serial_getc(int port) 0.00000 196: { 0.00000 197: char c; 0.00000 198: serial_read((void*) port, &c, 1); 0.001 __umodsi3 0.00000 478: 0.00000 479: 0.00000 480: 0.00000 481: 0.00000 482: 0.00122 483: 0.00000 484: 0.00000 485: 0.00000 486: 0.00000 487: 0.00000 488: 0.00000 489: 0.00000 490: 0.00000 491: 0.00000 492: 0.00000 493: 0.00000 494: 0.00000 495: 0.00000 496: 0.00000 497: 0.00000 498: 0.00000 499: 0.00000 500: 0.00000 501: 0.00000 502: 0.00000 503: 0.00000 504: 0.00000 505: 0.00000 506: 0.00000 507: 0.00000 508: 0.00000 509: 0.00000 510: 0.00000 511: 0.00000 512: 0.00000 513: 0.00000 514: 0.00000 515: 0.00000 516: 0.00000 517: 0.00000 518: 0.00000 519: 0.00000 520: 0.00000 521: 0.00000 522: 0.00000 523: 0.00000 524: 0.00000 525: 0.00000 526: 0.00000 527: 0.00000 528: 0.00000 529: 0.00000 530: 0.00000 531: 0.00000 532: 0.00000 533: 0.00000 534: 0.00000 535: 0.00000 536: 0.00000 537: 0.00000 538: 0.00000 539: 0.00000 540: 0.00000 541: 0.00000 542: 0.00000 543: 0.00000 544: 0.00000 545: 0.00000 546: 0.00000 547: 0.00000 548: 0.00000 549: 0.00000 550: 0.00000 551: 0.00000 552: 0.00000 553: 0.00000 554: 0.00000 555: 0.00000 556: 0.00000 557: 0.00000 558: 0.00000 559: 0.00000 560: 0.00000 561: 0.00000 562: 0.00000 563: 0.00000 564: 0.00000 565: 0.00000 566: 0.00000 567: 0.00000 568: 0.00000 569: 0.00000 570: 0.00000 571: 0.00000 572: 0.00000 573: 0.00000 574: 0.00000 575: 0.00000 576: 0.00000 577: 0.00000 578: 0.00000 579: 0.00000 580: 0.00000 581: 0.00000 582: 0.00000 583: 0.00000 584: 0.00000 585: 0.00000 586: 0.00000 587: 0.00000 588: 0.00000 589: 0.00000 590: 0.00000 591: 0.00000 592: 0.00000 593: 0.00000 594: 0.00000 595: 0.00000 596: 0.00000 597: 0.00000 598: 0.00000 599: 0.00000 600: 0.00000 601: 0.00000 602: 0.00000 603: 0.00000 604: 0.00000 605: 0.00000 606: 0.00000 607: 0.00000 608: 0.00000 609: 0.00000 610: 0.00000 611: 0.00000 612: 0.00000 613: 0.00000 614: 0.00000 615: 0.00000 616: 0.00000 617: 0.00000 618: 0.00000 619: 0.00000 620: 0.00000 621: 0.00000 622: 0.00000 623: 0.00000 624: 0.00000 625: 0.00000 626: 0.00000 627: 0.00000 628: 0.00000 629: 0.00000 630: 0.00000 631: 0.00000 632: 0.00000 633: 0.00000 634: 0.00000 635: 0.00000 636: 0.00000 637: 0.00000 638: 0.00000 639: 0.00000 640: 0.00000 641: 0.00000 642: 0.00000 643: 0.00000 644: 0.00000 645: 0.00000 646: 0.00000 647: 0.00000 648: 0.00000 649: 0.00000 650: 0.00000 651: 0.00000 652: 0.00000 653: 0.00000 654: 0.00000 655: 0.00000 656: 0.00000 657: 0.00000 658: 0.00000 659: 0.00000 660: 0.00000 661: 0.00000 662: 0.00000 663: 0.00000 664: 0.00000 665: 0.00000 666: 0.00000 667: 0.00000 668: 0.00000 669: 0.00000 670: 0.00000 671: 0.00000 672: 0.00000 673: 0.00000 674: 0.00000 675: 0.00000 676: 0.00000 677: 0.00000 678: 0.00000 679: 0.00000 680: 0.00000 681: 0.00000 682: 0.00000 683: 0.00000 684: 0.00000 685: 0.00000 686: 0.00000 687: 0.00000 688: 0.00000 689: 0.00000 690: 0.00000 691: 0.00000 692: 0.00000 693: 0.00000 694: 0.00000 695: 0.00000 696: 0.00000 697: 0.00000 698: 0.00000 699: 0.00000 700: 0.00000 701: 0.00000 702: 0.00000 703: 0.00000 704: 0.00000 705: 0.00000 706: 0.00000 707: 0.00000 708: 0.00000 709: 0.00000 710: 0.00000 711: 0.00000 712: 0.00000 713: 0.00000 714: 0.00000 715: 0.00000 716: 0.00000 717: 0.00000 718: 0.00000 719: 0.00000 720: 0.00000 721: 0.00000 722: 0.00000 723: 0.00000 724: 0.00000 725: 0.00000 726: 0.00000 727: 0.00000 728: 0.00000 729: 0.00000 730: 0.00000 731: 0.00000 732: 0.00000 733: 0.00000 734: 0.00000 735: 0.00000 736: 0.00000 737: 0.00000 738: 0.00000 739: 0.00000 740: 0.00000 741: 0.00000 742: 0.00000 743: 0.00000 744: 0.00000 745: 0.00000 746: 0.00000 747: 0.00000 748: 0.00000 749: 0.00000 750: 0.00000 751: 0.00000 752: 0.00000 753: 0.00000 754: 0.00000 755: 0.00000 756: 0.00000 757: 0.00000 758: 0.00000 759: 0.00000 760: 0.00000 761: 0.00000 762: 0.00000 763: 0.00000 764: 0.00000 765: 0.00000 766: 0.00000 767: 0.00000 768: 0.00000 769: 0.00000 770: 0.00000 771: 0.00000 772: 0.00000 773: 0.00000 774: 0.00000 775: 0.00000 776: 0.00000 777: 0.00000 778: 0.00000 779: 0.00000 780: 0.00000 781: 0.00000 782: 0.00000 783: 0.00000 784: 0.00000 785: 0.00000 786: 0.00000 787: 0.00000 788: 0.00000 789: 0.00000 790: 0.00000 791: 0.00000 792: 0.00000 793: 0.00000 794: 0.00000 795: 0.00000 796: 0.00000 797: 0.00000 798: 0.00011 799: 0.00004 800: 0.00004 801: 0.00000 802: 0.00000 803: 0.00004 804: 0.00000 805: 0.00000 806: 0.00000 807: 0.00000 808: 0.00000 809: 0.001 lcd_put_info 0.00000 332: 0.00000 333: #define USEC_PER_HOUR (3600*1000000) 0.00000 334: 0.00000 335: int lcd_count = 0; 0.00000 336: void lcd_put_info() 0.00004 337: { 0.00000 338: lcd_count++; 0.00000 339: 0.00004 340: uint64_t now = nkern_utime(); 0.00004 341: uint64_t sec = now/1000000; 0.00004 342: int hours = (int) sec/3600L; 0.00019 343: int minutes = (sec - hours*3600L)/60; 0.00000 344: int seconds = (sec - hours*3600L - minutes*60L); 0.00000 345: 0.00004 346: charlcd_goto(0, 0); 0.00031 347: pprintf(charlcd_putc, "eCAN %5d:%02d:%02d\n", hours, minutes, seconds ); 0.00004 348: ip4_addr_t ipaddr = ip_primary_address(); 0.00000 349: 0.00000 350: int PAGE_DELAY = 2; // how many seconds between pages? 0.00000 351: int NPAGES = 4; // how many pages do we have? 0.00000 352: 0.00000 353: int page = (sec/PAGE_DELAY) % NPAGES; 0.00019 354: switch (page) 0.00000 355: { 0.00000 356: case 0: 0.00008 357: pprintf(charlcd_putc, "%i.%i.%i.%i\n", (int) (ipaddr>>24)&0xff, 0.00000 358: (int) (ipaddr>>16)&0xff, (int) (ipaddr>>8)&0xff, (int) ipaddr&0xff); 0.00000 359: break; 0.00000 360: case 1: 0.00004 361: pprintf(charlcd_putc, "FW: "__DATE__ "\n"); 0.00000 362: break; 0.00000 363: case 2: 0.00011 364: pprintf(charlcd_putc, "CAN 0: %u\n", (int) (cfg_state[0].message_count)&0xfffff); 0.00000 365: break; 0.00000 366: case 3: 0.00008 367: pprintf(charlcd_putc, "CAN 1: %u\n", (int) (cfg_state[1].message_count)&0xfffff); 0.00000 368: break; 0.00000 369: } 0.00000 370: 0.00011 371: pprintf(serial_putc_1, "hello\n"); 0.00000 372: } 0.00000 373: 0.00000 374: int button_down() 0.00000 375: { 0.00000 376: return !(FIO2PIN & (1<<10)); 0.001 _nkern_wait_list_remove 0.00000 59: int _nkern_wait_list_remove(nkern_wait_list_t *l, nkern_wait_t *n) 0.00000 60: { 0.00000 61: nkern_wait_t **p = &l->head; 0.00000 62: nkern_wait_t *previous = NULL; 0.00000 63: 0.00100 64: while (*p) { 0.00000 65: if ((*p) == n) { 0.00000 66: (*p) = n->next; 0.00000 67: 0.00000 68: if (n == l->tail) 0.00000 69: l->tail = previous; 0.00000 70: 0.00000 71: n->next = NULL; 0.00000 72: return 0; 0.00000 73: } 0.00000 74: previous = *p; 0.00000 75: p = &((*p)->next); 0.00000 76: } 0.00000 77: 0.00000 78: return -1; 0.00011 79: } 0.00000 80: 0.00000 81: 0.00000 82: 0.00000 83: 0.00000 84: 0.001 _nkern_wait_list_is_empty 0.00000 47: n->next = NULL; 0.00000 48: return n; 0.00000 49: } 0.00000 50: 0.00000 51: uint32_t _nkern_wait_list_is_empty(nkern_wait_list_t *l) 0.00023 52: { 0.00000 53: return l->head == NULL; 0.00065 54: } 0.00000 55: 0.00000 56: // search for and remove the task from the list. n->next is set to 0.00000 57: // NULL if the item is found. returns -1 if the item was not found 0.00000 58: // (in which case n->next is not modified). 0.00000 59: int _nkern_wait_list_remove(nkern_wait_list_t *l, nkern_wait_t *n) 0.001 clear_line 0.00000 145: } 0.00000 146: 0.00000 147: static void clear_line() 0.00000 148: { 0.00000 149: // clear the rest of this line 0.00065 150: for (int i = x_pos; i < width; i++) 0.00015 151: charlcd_putc_raw(' '); 0.00000 152: 0.00008 153: charlcd_goto(x_pos, y_pos); 0.00000 154: } 0.00000 155: 0.00000 156: static void scroll() 0.00000 157: { 0.00000 158: // clear the rest of this line 0.001 lcd_task 0.00000 419: { 0.00000 420: (void) u; 0.00000 421: int count = 0; 0.00000 422: 0.00000 423: while (1) { 0.00015 424: if (button_down()) 0.00000 425: count++; 0.00000 426: else 0.00000 427: count = 0; 0.00000 428: 0.00000 429: if (count == 6) { 0.00000 430: reconfigure(); 0.00000 431: count = 0; 0.00000 432: } 0.00000 433: 0.00008 434: lcd_put_info(); 0.00031 435: nkern_usleep(250000); 0.00000 436: } 0.00000 437: } 0.00000 438: 0.00000 439: void initthread(void *u) 0.00000 440: { 0.000 serial_putc_1 0.00000 329: { 0.00000 330: serial_putc(0, c); 0.00000 331: } 0.00000 332: 0.00000 333: void serial_putc_1(char c) 0.00038 334: { 0.00011 335: serial_putc(1, c); 0.00000 336: } 0.00000 337: 0.00000 338: char serial_getc_0() 0.00000 339: { 0.00000 340: return serial_getc(0); 0.000 _nkern_wait_list_append 0.00000 15: enable_interrupts(&state); 0.00000 16: } 0.00000 17: 0.00000 18: void _nkern_wait_list_append(nkern_wait_list_t *l, nkern_wait_t *n) 0.00000 19: { 0.00015 20: if (l->head == NULL) { 0.00000 21: // empty list? 0.00000 22: l->head = n; 0.00000 23: l->tail = n; 0.00011 24: n->next = NULL; 0.00000 25: } else { 0.00000 26: // append 0.00015 27: n->next = NULL; 0.00000 28: 0.00000 29: l->tail->next = n; 0.00000 30: l->tail = n; 0.00000 31: } 0.00000 32: } 0.000 emac_link_task 0.00000 433: (void) user; 0.00000 434: 0.00000 435: int link = 0; 0.00000 436: 0.00000 437: while (1) { 0.00011 438: nkern_usleep(250000); 0.00000 439: 0.00011 440: uint32_t regv = read_phy (PHY_REG_STS); 0.00000 441: int newlink = regv & (1 << 0); 0.00000 442: 0.00019 443: if (newlink && !link) { 0.00000 444: // just connected 0.00000 445: emac_finish_initialization(); 0.00000 446: } 0.00000 447: if (!newlink && link) { 0.00000 448: // just disconnected 0.000 __divsi3 0.00000 368: 0.00000 369: 0.00000 370: 0.00000 371: 0.00000 372: 0.00023 373: 0.00000 374: 0.00000 375: 0.00000 376: 0.00000 377: 0.00000 378: 0.00000 379: 0.00000 380: 0.00000 381: 0.00000 382: 0.00000 383: 0.00000 384: 0.00000 385: 0.00000 386: 0.00000 387: 0.00000 388: 0.00000 389: 0.00000 390: 0.00000 391: 0.00000 392: 0.00000 393: 0.00000 394: 0.00000 395: 0.00000 396: 0.00000 397: 0.00000 398: 0.00000 399: 0.00000 400: 0.00000 401: 0.00000 402: 0.00000 403: 0.00000 404: 0.00000 405: 0.00000 406: 0.00000 407: 0.00000 408: 0.00000 409: 0.00000 410: 0.00000 411: 0.00000 412: 0.00000 413: 0.00000 414: 0.00000 415: 0.00000 416: 0.00000 417: 0.00000 418: 0.00000 419: 0.00000 420: 0.00000 421: 0.00000 422: 0.00000 423: 0.00000 424: 0.00000 425: 0.00000 426: 0.00000 427: 0.00000 428: 0.00000 429: 0.00000 430: 0.00000 431: 0.00000 432: 0.00000 433: 0.00000 434: 0.00000 435: 0.00000 436: 0.00000 437: 0.00000 438: 0.00000 439: 0.00000 440: 0.00000 441: 0.00000 442: 0.00000 443: 0.00000 444: 0.00000 445: 0.00000 446: 0.00000 447: 0.00000 448: 0.00000 449: 0.00000 450: 0.00000 451: 0.00000 452: 0.00000 453: 0.00000 454: 0.00000 455: 0.00000 456: 0.00000 457: 0.00000 458: 0.00000 459: 0.00000 460: 0.00000 461: 0.00000 462: 0.00000 463: 0.00000 464: 0.00000 465: 0.00000 466: 0.00000 467: 0.00000 468: 0.00000 469: 0.00000 470: 0.00000 471: 0.00000 472: 0.00000 473: 0.00000 474: 0.00000 475: 0.00000 476: 0.00000 477: 0.00000 478: 0.00000 479: 0.00000 480: 0.00000 481: 0.00000 482: 0.00000 483: 0.00000 484: 0.00000 485: 0.00000 486: 0.00000 487: 0.00000 488: 0.00000 489: 0.00000 490: 0.00000 491: 0.00000 492: 0.00000 493: 0.00000 494: 0.00000 495: 0.00000 496: 0.00000 497: 0.00000 498: 0.00000 499: 0.00000 500: 0.00000 501: 0.00000 502: 0.00000 503: 0.00000 504: 0.00000 505: 0.00000 506: 0.00000 507: 0.00000 508: 0.00000 509: 0.00000 510: 0.00000 511: 0.00000 512: 0.00000 513: 0.00000 514: 0.00000 515: 0.00000 516: 0.00000 517: 0.00000 518: 0.00000 519: 0.00000 520: 0.00000 521: 0.00000 522: 0.00000 523: 0.00000 524: 0.00000 525: 0.00000 526: 0.00000 527: 0.00000 528: 0.00000 529: 0.00000 530: 0.00000 531: 0.00000 532: 0.00000 533: 0.00000 534: 0.00000 535: 0.00000 536: 0.00000 537: 0.00000 538: 0.00000 539: 0.00000 540: 0.00000 541: 0.00000 542: 0.00000 543: 0.00000 544: 0.00000 545: 0.00000 546: 0.00000 547: 0.00000 548: 0.00000 549: 0.00000 550: 0.00000 551: 0.00000 552: 0.00000 553: 0.00000 554: 0.00000 555: 0.00000 556: 0.00000 557: 0.00000 558: 0.00000 559: 0.00000 560: 0.00000 561: 0.00000 562: 0.00000 563: 0.00000 564: 0.00000 565: 0.00000 566: 0.00000 567: 0.00000 568: 0.00000 569: 0.00000 570: 0.00000 571: 0.00000 572: 0.00000 573: 0.00000 574: 0.00000 575: 0.00000 576: 0.00000 577: 0.00000 578: 0.00000 579: 0.00000 580: 0.00000 581: 0.00000 582: 0.00000 583: 0.00000 584: 0.00000 585: 0.00000 586: 0.00000 587: 0.00000 588: 0.00000 589: 0.00000 590: 0.00000 591: 0.00000 592: 0.00000 593: 0.00000 594: 0.00000 595: 0.00000 596: 0.00000 597: 0.00000 598: 0.00000 599: 0.00000 600: 0.00000 601: 0.00000 602: 0.00000 603: 0.00000 604: 0.00000 605: 0.00000 606: 0.00000 607: 0.00000 608: 0.00000 609: 0.00000 610: 0.00000 611: 0.00000 612: 0.00000 613: 0.00000 614: 0.00000 615: 0.00000 616: 0.00000 617: 0.00000 618: 0.00000 619: 0.00000 620: 0.00000 621: 0.00000 622: 0.00000 623: 0.00000 624: 0.00000 625: 0.00000 626: 0.00000 627: 0.00000 628: 0.00000 629: 0.00000 630: 0.00000 631: 0.00000 632: 0.00000 633: 0.00000 634: 0.00000 635: 0.00000 636: 0.00000 637: 0.00000 638: 0.00000 639: 0.00000 640: 0.00000 641: 0.00000 642: 0.00000 643: 0.00000 644: 0.00000 645: 0.00000 646: 0.00000 647: 0.00000 648: 0.00000 649: 0.00000 650: 0.00000 651: 0.00000 652: 0.00000 653: 0.00000 654: 0.00000 655: 0.00000 656: 0.00000 657: 0.00000 658: 0.00000 659: 0.00000 660: 0.00000 661: 0.00000 662: 0.00000 663: 0.00000 664: 0.00000 665: 0.00000 666: 0.00000 667: 0.00000 668: 0.00000 669: 0.00000 670: 0.00000 671: 0.00000 672: 0.00000 673: 0.00000 674: 0.00000 675: 0.00000 676: 0.00000 677: 0.00000 678: 0.00000 679: 0.00000 680: 0.00000 681: 0.00000 682: 0.00000 683: 0.00000 684: 0.00000 685: 0.00000 686: 0.00000 687: 0.00000 688: 0.00000 689: 0.00000 690: 0.00000 691: 0.00000 692: 0.00000 693: 0.00000 694: 0.00000 695: 0.00000 696: 0.00000 697: 0.00000 698: 0.00000 699: 0.00000 700: 0.00000 701: 0.00000 702: 0.00000 703: 0.00000 704: 0.00000 705: 0.00000 706: 0.00000 707: 0.00000 708: 0.00000 709: 0.00000 710: 0.00000 711: 0.00000 712: 0.00000 713: 0.00000 714: 0.00000 715: 0.00000 716: 0.00000 717: 0.00000 718: 0.00000 719: 0.00000 720: 0.00000 721: 0.00000 722: 0.00000 723: 0.00000 724: 0.00000 725: 0.00000 726: 0.00000 727: 0.00000 728: 0.00000 729: 0.00000 730: 0.00000 731: 0.00000 732: 0.00000 733: 0.00000 734: 0.00000 735: 0.00000 736: 0.00000 737: 0.00000 738: 0.00000 739: 0.00000 740: 0.00000 741: 0.00000 742: 0.00000 743: 0.00000 744: 0.00000 745: 0.00000 746: 0.00000 747: 0.00000 748: 0.00000 749: 0.00000 750: 0.00000 751: 0.00000 752: 0.00000 753: 0.00000 754: 0.00000 755: 0.00000 756: 0.00000 757: 0.00000 758: 0.00000 759: 0.00000 760: 0.00000 761: 0.00000 762: 0.00000 763: 0.00000 764: 0.00000 765: 0.00000 766: 0.00000 767: 0.00000 768: 0.00000 769: 0.00000 770: 0.00000 771: 0.00000 772: 0.00000 773: 0.00000 774: 0.00000 775: 0.00000 776: 0.00000 777: 0.00000 778: 0.00000 779: 0.00000 780: 0.00000 781: 0.00000 782: 0.00000 783: 0.00000 784: 0.00000 785: 0.00000 786: 0.00000 787: 0.00000 788: 0.00000 789: 0.00000 790: 0.00000 791: 0.00000 792: 0.00000 793: 0.00000 794: 0.00000 795: 0.00000 796: 0.00000 797: 0.00000 798: 0.00000 799: 0.00000 800: 0.00000 801: 0.00000 802: 0.00000 803: 0.00000 804: 0.00000 805: 0.00000 806: 0.00000 807: 0.00000 808: 0.00000 809: 0.00000 810: 0.00000 811: 0.00000 812: 0.00000 813: 0.00000 814: 0.00000 815: 0.00000 816: 0.00000 817: 0.00000 818: 0.00000 819: 0.00000 820: 0.00000 821: 0.00000 822: 0.00000 823: 0.00000 824: 0.00000 825: 0.00000 826: 0.00000 827: 0.00000 828: 0.00000 829: 0.00000 830: 0.00000 831: 0.00000 832: 0.00000 833: 0.00000 834: 0.00000 835: 0.00000 836: 0.00000 837: 0.00000 838: 0.00000 839: 0.00000 840: 0.00000 841: 0.00000 842: 0.00000 843: 0.00000 844: 0.00000 845: 0.00000 846: 0.00000 847: 0.00000 848: 0.00000 849: 0.00000 850: 0.00000 851: 0.00000 852: 0.00000 853: 0.00000 854: 0.00000 855: 0.00004 856: 0.00004 857: 0.00000 858: 0.00000 859: 0.00000 860: 0.00000 861: 0.00000 862: 0.000 scroll 0.00000 154: } 0.00000 155: 0.00000 156: static void scroll() 0.00000 157: { 0.00000 158: // clear the rest of this line 0.00011 159: for (int i = x_pos; i < width; i++) 0.00000 160: charlcd_putc_raw(' '); 0.00000 161: 0.00000 162: // move to next line 0.00004 163: x_pos = 0; 0.00015 164: y_pos++; 0.00000 165: if (y_pos == height) 0.00000 166: y_pos = 0; 0.00000 167: 0.00000 168: charlcd_goto(0, y_pos); 0.00000 169: } 0.000 pprintf_unsigned_decimal 0.00000 42: { 0.00000 43: char pprintf_tmp[64]; 0.00000 44: int len = 0; 0.00000 45: 0.00000 46: do { 0.00008 47: int tv = v%10; 0.00000 48: v=v/10; 0.00000 49: pprintf_tmp[len++]=tv+'0'; 0.00008 50: } while (v>0 || (leadingzero && len < width)); 0.00000 51: 0.00000 52: if (width > 0 && !leftadjust) 0.00000 53: for (int i = len ; i < width; i++) 0.00000 54: putc(' '); 0.00000 55: 0.00004 56: for (int i = len-1; i >= 0; i--) 0.00004 57: putc(pprintf_tmp[i]); 0.00000 58: 0.00000 59: if (width > 0 && leftadjust) 0.00000 60: for (int i = len ; i < width; i++) 0.00000 61: putc(' '); 0.00000 62: } 0.000 ip_primary_address 0.00000 158: return 0; 0.00000 159: } 0.00000 160: 0.00000 161: ip4_addr_t ip_primary_address() 0.00000 162: { 0.00015 163: if (ip_config_head) 0.00000 164: return ip_config_head->ip_addr; 0.00000 165: return 0x7f000001; 0.00004 166: } 0.00000 167: 0.00000 168: static ip4_addr_t inet_addr_numeric(const char *s) 0.00000 169: { 0.00000 170: ip4_addr_t addr = 0; 0.00000 171: 0.000 ip_checksum 0.00000 17: int remaining = len; 0.00000 18: uint32_t lo = 0, hi = 0; 0.00000 19: while (remaining >= 2) { 0.00000 20: hi += *p++; 0.00000 21: lo += *p++; 0.00011 22: remaining -= 2; 0.00000 23: } 0.00000 24: 0.00000 25: if (remaining) { 0.00000 26: hi += *p++; 0.00000 27: remaining --; 0.000 button_down 0.00000 371: pprintf(serial_putc_1, "hello\n"); 0.00000 372: } 0.00000 373: 0.00000 374: int button_down() 0.00000 375: { 0.00011 376: return !(FIO2PIN & (1<<10)); 0.00000 377: } 0.00000 378: 0.00000 379: void wait_until_button_down() 0.00000 380: { 0.00000 381: while (!button_down()); 0.000 net_udp_receive 0.00000 39: 0.00000 40: // is there a listener? 0.00000 41: uint32_t port = net_decode_u16(udp_hdr->dst_port); 0.00000 42: 0.00000 43: udp_listener_t *listener = listeners_head; 0.00008 44: while (listener != NULL) { 0.00000 45: if (listener->port == port) 0.00000 46: break; 0.00000 47: listener = listener->next; 0.00000 48: } 0.00000 49: 0.000 fragment_rx_task 0.00000 534: // if no data, sleep. 0.00000 535: irqstate_t flags; 0.00000 536: disable_interrupts(&flags); 0.00000 537: if (MAC_RXCONSUMEINDEX == MAC_RXPRODUCEINDEX) 0.00000 538: nkern_wait(&fragment_rx_waitlist); 0.00004 539: enable_interrupts(&flags); 0.00000 540: } 0.00000 541: } 0.00000 542: 0.00000 543: static void chunk_free(net_chunk_t *c) 0.00000 544: { 0.000 packet_and_chunk_free 0.00000 619: // be careful: net_chunk_free will modify c->next_chunk. 0.00000 620: 0.00000 621: // if we maintained the chunk tail ptr, we could release all the 0.00000 622: // chunks in O(1) 0.00000 623: 0.00004 624: while (c != NULL) { 0.00000 625: net_chunk_t *nc = c->next_chunk; 0.00000 626: chunk_free(c); 0.00000 627: c = nc; 0.00000 628: } 0.00000 629: 0.000 net_ip_receive 0.00000 68: } 0.00000 69: 0.00000 70: /** offset is the index (always in the first chunk) to teh beginning of the ip_header **/ 0.00000 71: void net_ip_receive(net_packet_t *p, int offset) 0.00000 72: { 0.00004 73: struct ip_header * ip_hdr = (struct ip_header*) &p->first_chunk->buffer[offset]; 0.00000 74: 0.00000 75: // unknown IP version or incompatible IP header length? 0.00000 76: if (ip_hdr->ver_hdrlen != 0x45) 0.00000 77: goto exit; 0.00000 78: 0.000 net_decode_u16 0.00000 264: } 0.00000 265: 0.00000 266: uint16_t net_decode_u16(uint8_t *p) 0.00000 267: { 0.00000 268: return (p[0]<<8) | p[1]; 0.00004 269: } 0.00000 270: 0.00000 271: 0.00000 272: uint16_t ip_checksum_chunks(net_chunk_t *chunk, int offset, int size) 0.00000 273: { 0.00000 274: uint16_t chk = 0; Total hits: 2612905