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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> Вопрос по прерываниям, __int во время __swi Подскажите !!!
Сергей Борщ
сообщение Mar 22 2007, 12:22
Сообщение #16


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Paramon @ Mar 22 2007, 07:13) *
вчера испытывал пример с таблицами - не вышло.

Странно. Я правда с ARTX не знаком, но предполагал нечто такое:
Код
void (*pFunc_t)(void);
pFunc_t pFuncTable[] =
{
   &Func1, &Func2, &Func3
};

void Task1 (void) __task
{
   for(;;)
   {
      pFuncTable[0]();
      ............
   }

}

Цитата(Paramon @ Mar 22 2007, 07:13) *
void SWI_Handler(int set) __swi(8) //set - потом будет номером ф-ии
Вот здесь мне кажется неправильный подход. У вас уже есть возможность номер фукции задать в аргументе __swi(). В проекте, в котором описаны flash-функции:
Код
void BIOSFunc1Implementation(int param1, int param2)  __swi(0)  // нужный список параметров и возвращаемое значение
{

}
int  BIOSFunc2Implementation(void)  __swi(1)
{

}
.........
//и так все функции.

в проекте, из которого функции вызываются:
Код
extern void  BIOSFunc1(int, int)  __swi(0);
extern int  BIOSFunc2(void)  __swi(1);

/ * Task 1
void Func1 (void) __task {
........
int a;
while (1) {
  BIOSFunc1(100,200);
  os_dly_wait (1);
  a = BIOSFunc2();
};


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Paramon
сообщение Mar 22 2007, 12:59
Сообщение #17


Частый гость
**

Группа: Участник
Сообщений: 128
Регистрация: 5-10-06
Пользователь №: 20 997



Цитата(Сергей Борщ @ Mar 22 2007, 12:22) *
Странно. Я правда с ARTX не знаком, но предполагал нечто такое:
Код
void (*pFunc_t)(void);
pFunc_t pFuncTable[] =
{
   &Func1, &Func2, &Func3
};

void Task1 (void) __task
{
   for(;;)
   {
      pFuncTable[0]();
      ............
   }

}

Вот здесь мне кажется неправильный подход. У вас уже есть возможность номер фукции задать в аргументе __swi(). В проекте, в котором описаны flash-функции:
Код
void BIOSFunc1Implementation(int param1, int param2)  __swi(0)  // нужный список параметров и возвращаемое значение
{

}
int  BIOSFunc2Implementation(void)  __swi(1)
{

}
.........
//и так все функции.

в проекте, из которого функции вызываются:
Код
extern void  BIOSFunc1(int, int)  __swi(0);
extern int  BIOSFunc2(void)  __swi(1);

/ * Task 1
void Func1 (void) __task {
........
int a;
while (1) {
  BIOSFunc1(100,200);
  os_dly_wait (1);
  a = BIOSFunc2();
};



У меня подобное вчера как раз и не получилось!
Формат талицы на асме из примера мой компилятор отказался понимать, а каков он должен быть я пока незнаю! Стал обходить другим путём - вышло то, что я описал.
os_tsk_create - "генерим" функцию появляется task
os_tsk_delete_self - удаляем task и функции нет.
Сегодня попробую испытать с вашим кодом - он намного красивей!
Go to the top of the page
 
+Quote Post
Paramon
сообщение Mar 23 2007, 09:05
Сообщение #18


Частый гость
**

Группа: Участник
Сообщений: 128
Регистрация: 5-10-06
Пользователь №: 20 997



Цитата(Paramon @ Mar 22 2007, 12:59) *
У меня подобное вчера как раз и не получилось!
Формат талицы на асме из примера мой компилятор отказался понимать, а каков он должен быть я пока незнаю! Стал обходить другим путём - вышло то, что я описал.
os_tsk_create - "генерим" функцию появляется task
os_tsk_delete_self - удаляем task и функции нет.
Сегодня попробую испытать с вашим кодом - он намного красивей!



Кажется получилось:

#include <ARTX.H>
OS_TID t_Func1; //
OS_TID t_Task2; //
OS_TID t_Task3;
//unsigned int counter;
void Func2 (int par) __swi(8);
void Func3 (void) __swi(9);
void Task2 (int par) __task;
void Task3 (void) __task;

// * Func 2
void Func2 (int par) __swi(8)
{
t_Task2 = os_tsk_create_ex(Task2,2,par);
}

// * Task 2
void Task2 (int par) __task
{
while (par<0xFFFFFFFF)
{
os_dly_wait (5);
par++;
};
os_tsk_delete_self();
}

// * Func 3
void Func3(void) __swi(9)
{
t_Task2 = os_tsk_create(Task3,2);
}
// * Task 3
void Task3 () __task
{
while(1)
{
os_itv_set(50);
os_itv_wait();
};
}
// * Func 1
void Func1 (void) __task {
t_Func1 = os_tsk_self ();
while (1) {
Func2(200);
os_dly_wait (1);
Func3();
os_dly_wait (1);
};
}
void init(void) __task
{
t_Func1=os_tsk_create(Func1,0);
os_itv_set(5);
os_itv_wait();
//
os_tsk_delete_self(); //
}
//
void main(void)
{
os_sys_init(init); //
}

Func2 и Func3 как и положено в асме:

49: Func2(200);
0x000805F8 20C8 MOV R0,#0xC8
0x000805FA DF08 SWI 0x08
50: os_dly_wait (1);
0x000805FC 2001 MOV R0,#0x01
0x000805FE F000 BL os_dly_wait(0x00080DC4) - Part #1
0x00080600 FBE1 BL os_dly_wait(0x00080DC4) - Part #2
51: Func3();
0x00080602 DF09 SWI 0x09
52: os_dly_wait (1);
0x00080604 2001 MOV R0,#0x01
0x00080606 F000 BL os_dly_wait(0x00080DC4) - Part #1
0x00080608 FBDD BL os_dly_wait(0x00080DC4) - Part #2

све TASKи вазываются и работают.
и с режимом ядра ничего ненадо делать!
SWI короткий!!!
передать параметр в ф-ю удалось! Вернуть некому, SWI давно завершён!
Наверное проще будет передавать
указатель!

Спасибо вам огромное!!!
С уважением PARAMON!

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

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

 


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


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