Jump to content

    

jezo

Участник
  • Content Count

    15
  • Joined

  • Last visited

Community Reputation

0 Обычный

About jezo

  • Rank
    Участник
  1. uCOS, PIC32 и bootloader

    Уже не нужно, работает...
  2. uCOS, PIC32 и bootloader

    Привет всем! Делаю bootloader для PIC32MX460F512L (изменён microchip serial bоot.). Bootloader работает, проблема аппликация. Обычная апп. (из примеру microchip) имеет автоматически генерированый startupCode по адресу 0x9D001000. Аппликация основанная на порте из микриума имеет этот код заблокированый (*.mcp: suite_state=-nostartfiles), и взамен есть файл crt0.s, где находится секция .reset . Она перекладывается в kseg1_boot_mem (0xBFC00000) - это плохо, там находится bootloader. Я не знаю как сделать, чтобы .reset пошел в kseg0_boot_mem (0x9D001000). Посоветуете кто-нибудь?
  3. ICD2-SeVeN

    Неделал, но вообще ICD работающий через COM является очень медленный
  4. PIC+SDRAM

    Немножко подобно есть в Elektor 1/2007, LCD дисплей + AVR + DRAM, если не найтись пдф на нете, напиши, могу выложить.
  5. Цитата(Alex B._ @ Aug 9 2007, 16:51) >> Да, таблицa переходов есть, но я не вижу её использовать Да не надо ее пользовать! Ее компилятор пользует. Если функция в адресном пространстве до 0x10000, используется прямой адрес... OK, спасибо за пояснение. Ну затем строчка в OSTaskStkInit: pc_high = (INT8U)(((INT32U)task >> 16) & 0x7F); не имеет никакой смысл. На етой строчке мне начал код ошибаться. Моя программa ~80kB, 8 задач и все в нижной памяти. Но с одного времени у одного таску начало наполнять pc_high неправильным номером, и сделалo address error trap. Потому я дал твёрдо pc_high = 0 и пока всё работает правильно.
  6. Цитата(Alex B._ @ Aug 8 2007, 16:26) 2jezo >> Никакой таблици я не вижу значит не туда смотрите. Надо глядеть после таблицы векторов прерываний Да, таблицa переходов есть, но я не вижу её использовать. Когда просмотришь дисасембл, как параметр OSTaskCreateExt(AppStartTask,...) передается реальный адрес на AppStartTask, не 0x200 (вектор из таблицы)! Затем OSTaskCreateExt перенесёт адрес в OSTaskStkInit и он возложит её до стеку. Если адрес > 0xffff, наступит ошибкa в OS_TASK_SW... У меня последний C30 и settings: -g -mlarge-code -mlarge-data -mlarge-scalar -O1
  7. Цитата(Alex B._ @ Jun 15 2007, 16:23) С30 для всех функций которые вызываются по указателю создает таблицу переходов в начале памяти программ (т.е. где адрес заведомо меньше 2^16-1) Скомпилируйте пример и посмотрите. Спасибо за ответ Alex. Я посмотрел, nо не поумнел. Вот код из вашего примерa: ///////////////////////////////////////////////////////////////////////////////////////////////////// int main (void) 57: {[font=Courier New] 00470 FA0002 lnk #0x2 58: unsigned char errc; 59: 60: OSInit(); // uCOS-II init 00472 0211AE call 0x0011ae 00474 000000 nop 61: 62: // Create start task, that creates all other tasks and events 63: 64: OSTaskCreateExt(AppStartTask, // Create application start task 00476 200030 mov.w #0x3,0x0000 ;OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR 00478 781F80 mov.w 0x0000,[0x001e++] 0047A EB1F80 clr.w [0x001e++] ;(void *)0, 0047C 200806 mov.w #0x80,0x000c ;APP_TASK_START_STK_SIZE 0047E 200007 mov.w #0x0,0x000e 00480 213265 mov.w #0x1326,0x000a ;&AppStartTaskStk[APP_TASK_START_STK_SIZE - 1] 00482 200054 mov.w #0x5,0x0008 ;APP_TASK_START_PRIO 00484 784184 mov.b 0x0008,0x0006 00486 212282 mov.w #0x1228,0x0004 ;&AppStartTaskStk[0] 00488 EB0080 clr.w 0x0002 0048A 204B00 mov.w #0x4b0,0x0000 ;AppStartTask!!! 0x4b0 = реальный адрес, не таблица 0048C 0221EC call 0x0021ec 0048E 000000 nop 65: (void *)0, // Appl start task parameter 66: (OS_STK *)& AppStartTaskStk[0], // Top of task stack pointer 67: APP_TASK_START_PRIO, // Prioriity 68: APP_TASK_START_PRIO, // Task ID - should be the same as priority 69: (OS_STK *)&AppStartTaskStk[APP_TASK_START_STK_SIZE - 1], // Bottom of task stack pointer 70: APP_TASK_START_STK_SIZE, // Stack size 71: (void *)0, // Supplied memory location 72: OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR); // Options ///////////////////////////////////////////////////////////////////////////////////////////////////// 106: __task static void AppStartTask (void *p_arg) 107: { 004B0 FA0002 lnk #0x2 108: unsigned char errc; 109: 110: // Setup RTOS timer 111: 112: T2CON_bit.TCS = 0; // Clock source - internal 004B2 A92110 bclr.b 0x0110,#1 ..... ///////////////////////////////////////////////////////////////////////////////////////////////////// 290: INT8U OSTaskCreateExt (void (*task)(void *p_arg), 291: void *p_arg, 292: OS_STK *ptos, 293: INT8U prio, 294: INT16U id, 295: OS_STK *pbos, 296: INT32U stk_size, 297: void *pext, 298: INT16U opt) 299: { 021EC 4787E8 add.w 0x001e,#8,0x001e 021EE BE9F88 mov.d 0x0010,[0x001e++] 021F0 BE9F8A mov.d 0x0014,[0x001e++] 021F2 BE9F8C mov.d 0x0018,[0x001e++] 021F4 781F8E mov.w 0x001c,[0x001e++] 021F6 780600 mov.w 0x0000,0x0018 ;AppStartTask -> W12 021F8 780581 mov.w 0x0002,0x0016 021FA 780502 mov.w 0x0004,0x0014 021FC 9FEFC3 mov.b 0x0006,[0x001e-20] 021FE 780684 mov.w 0x0008,0x001a 02200 780705 mov.w 0x000a,0x001c 02202 BE0406 mov.d 0x000c,0x0010 ...... 325: psp = OSTaskStkInit(task, p_arg, ptos, opt); /* Initialize the task's stack */ 0225C 97B19F mov.w [0x001e-30],0x0006 0225E 78010A mov.w 0x0014,0x0004 02260 78008B mov.w 0x0016,0x0002 02262 78000C mov.w 0x0018,0x0000 ;W12 -> task 02264 02071A call 0x00071a Никакой таблици я не вижу и адрес на task идёт только через 2 байты.
  8. В OSTaskCreateExt и OSTaskStkInit есть как parameter function pointer "void (*task)(void *p_arg)". Но в MPLAB C30 все pointers только 16-bit. OSTaskStkInit затем некогда запишет до стека неправильный третий байт и как OSCtxSw пустит retfie, наступит AddressError trap. Ошибка ясная, но решение незнакомое. Я не знаю, как получить полный адрес функций Помогите пожалуйста!