jezo
-
Постов
15 -
Зарегистрирован
-
Посещение
Сообщения, опубликованные jezo
-
-
Привет всем! Делаю 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). Посоветуете кто-нибудь?
-
Неделал, но вообще ICD работающий через COM является очень медленный :01:
-
Немножко подобно есть в Elektor 1/2007, LCD дисплей + AVR + DRAM, если не найтись пдф на нете, напиши, могу выложить.
-
>> Да, таблицa переходов есть, но я не вижу её использовать
Да не надо ее пользовать! Ее компилятор пользует. Если функция в адресном пространстве до 0x10000, используется прямой адрес...
OK, спасибо за пояснение. Ну затем строчка в OSTaskStkInit:
pc_high = (INT8U)(((INT32U)task >> 16) & 0x7F);
не имеет никакой смысл. На етой строчке мне начал код ошибаться. Моя программa ~80kB, 8 задач и все в нижной памяти. Но с одного времени у одного таску начало наполнять pc_high неправильным номером, и сделалo address error trap. Потому я дал твёрдо pc_high = 0 и пока всё работает правильно.
-
2jezo
>> Никакой таблици я не вижу
значит не туда смотрите. Надо глядеть после таблицы векторов прерываний
Да, таблицa переходов есть, но я не вижу её использовать. Когда просмотришь дисасембл, как параметр OSTaskCreateExt(AppStartTask,...) передается реальный адрес на AppStartTask, не 0x200 (вектор из таблицы)! Затем OSTaskCreateExt перенесёт адрес в OSTaskStkInit и он возложит её до стеку. Если адрес > 0xffff, наступит ошибкa в OS_TASK_SW...
У меня последний C30 и settings:
-g -mlarge-code -mlarge-data -mlarge-scalar -O1
-
Опубликовано · Изменено пользователем jezo · Пожаловаться
С30 для всех функций которые вызываются по указателю создает таблицу переходов в начале памяти программ (т.е. где адрес заведомо меньше 2^16-1) Скомпилируйте пример и посмотрите.Спасибо за ответ Alex. Я посмотрел, nо не поумнел. Вот код из вашего примерa:
/////////////////////////////////////////////////////////////////////////////////////////////////////
int main (void)
57: {
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 байты.
-
В OSTaskCreateExt и OSTaskStkInit есть как parameter function pointer "void (*task)(void *p_arg)". Но в MPLAB C30 все pointers только 16-bit. OSTaskStkInit затем некогда запишет до стека неправильный третий байт и как OSCtxSw пустит retfie, наступит AddressError trap. Ошибка ясная, но решение незнакомое. Я не знаю, как получить полный адрес функций :( Помогите пожалуйста!
uCOS, PIC32 и bootloader
в uC/OS-II
Опубликовано · Пожаловаться
Уже не нужно, работает...