реклама на сайте
подробности

 
 
> Ошибка в порте uC/OS для dsPIC33
jezo
сообщение Jun 15 2007, 08:36
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 15
Регистрация: 17-08-06
Пользователь №: 19 633



В OSTaskCreateExt и OSTaskStkInit есть как parameter function pointer "void (*task)(void *p_arg)". Но в MPLAB C30 все pointers только 16-bit. OSTaskStkInit затем некогда запишет до стека неправильный третий байт и как OSCtxSw пустит retfie, наступит AddressError trap. Ошибка ясная, но решение незнакомое. Я не знаю, как получить полный адрес функций sad.gif Помогите пожалуйста!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Alex B._
сообщение Jun 15 2007, 12:23
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 943
Регистрация: 6-07-04
Из: Санкт-Петербург
Пользователь №: 274



Нет там никакой ошибки, вы просто плохо знакомы с компилятором.
С30 для всех функций которые вызываются по указателю создает таблицу переходов в начале памяти программ (т.е. где адрес заведомо меньше 2^16-1) Скомпилируйте пример и посмотрите.
В первом релизе была другая ошибка из-за которой возникал exception при первом переключении контекста, поэтому если качали давно, скачайте новый.

И еще, может интересно будет:
http://www.pic24.ru/uCOS/uCOS_PIC24_dsPIC.pdf
http://www.pic24.ru/uCOS/uCOS_PIC24_dsPIC.rar
Go to the top of the page
 
+Quote Post
jezo
сообщение Jun 19 2007, 09:19
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 15
Регистрация: 17-08-06
Пользователь №: 19 633



Цитата(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 байты.

Сообщение отредактировал jezo - Jun 19 2007, 09:22
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- jezo   Ошибка в порте uC/OS для dsPIC33   Jun 15 2007, 08:36
- - Newegor   Пытаюсь первый раз собрать ось по dsPIC30F6014A, н...   Aug 8 2007, 08:31
- - Alex B._   Newegor не знаю в чем у вас может быть проблема......   Aug 8 2007, 12:26
|- - jezo   Цитата(Alex B._ @ Aug 8 2007, 16:26) 2jez...   Aug 9 2007, 11:15
- - Newegor   да действительно ругается на __task, если удалить...   Aug 8 2007, 12:41
- - Alex B._   компилятор-то какой? __task определен дефайном ка...   Aug 8 2007, 19:22
- - Newegor   Разобрался! При портировании под другой пик, я...   Aug 9 2007, 05:45
- - Alex B._   Только используйте аккуратно - в этом порте есть б...   Aug 9 2007, 06:56
- - Newegor   И еще вопрос, стоит ли обратить внимание на вот эт...   Aug 9 2007, 07:12
- - Alex B._   это вы опять чего-то с h-файлами намудрили... Нет ...   Aug 9 2007, 09:01
- - Alex B._   >> Да, таблицa переходов есть, но я не вижу ...   Aug 9 2007, 12:51
- - jezo   Цитата(Alex B._ @ Aug 9 2007, 16:51) ...   Aug 9 2007, 13:30


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 11:18
Рейтинг@Mail.ru


Страница сгенерированна за 0.01499 секунд с 7
ELECTRONIX ©2004-2016