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

 
 
> Разделение ресурса, под ucOS-II
prottoss
сообщение Feb 6 2008, 08:48
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Всем привет!

Такая вот проблемка. Есть железный SPI0 на AT91SAM7X. По этому интерфейу подключено два устройства, каждое устройство обслуживается своей задачей. Написал вот такой код для обращения к SPI:

Код
SPI_RESULT SPI_Xfer(SPI_XDesc_t *desc)
{

/* Check valid device number */
   if(g_DevCnt <= desc->dev_idx)
        return SPI_RES_INVALID_DEVICE_INDEX;

/* Get desc & interface */
SPI_CS_DESC *cs = &g_SPI_CS[desc->dev_idx];
AT91PS_SPI spi = cs->spi;

/* Wait for SPI unlocked */
UINT8 os_err;
OSFlagPend(g_SPI_Events, cs->locked,
      OS_FLAG_WAIT_SET_ANY | OS_FLAG_CONSUME, SPI_XFER_TIMEOUT, &os_err);



/* Interface is locked. Select device */



................................................................................
.........................


    /* Unlock interface & return OK */
OSFlagPost(g_SPI_Events, cs->locked, OS_FLAG_SET, &os_err);
return SPI_RES_OK;

}


Поясню идею. Создан флаг блокировки интерфейса. Когда он установлен - интерфейс не блокирован, но при выходе из функции OSFlagPend он автоматически обнуляется, тем самым блокируя интерфейс для всех остальных задач. При выходе из функции передачи SPI_Xfer(...) флаг блокировки опять устанавливется, тем самым разрешая другой задаче работать с интерфейсом...

Вот только что-то не совсем все это работает. Кто знает, поясните, где я ошибаюсь.


--------------------
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
AndrewN
сообщение Feb 7 2008, 14:11
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 336
Регистрация: 7-03-07
Из: Петербург
Пользователь №: 25 961



Цитата(prottoss @ Feb 6 2008, 11:48) *
Такая вот проблемка. Есть железный SPI0 на AT91SAM7X. По этому интерфейу подключено два устройства, каждое устройство обслуживается своей задачей. Написал вот такой код для обращения к SPI:

Код
code snipped


Поясню идею. Создан флаг блокировки интерфейса. Когда он установлен - интерфейс не блокирован, но при выходе из функции OSFlagPend он автоматически обнуляется, тем самым блокируя интерфейс для всех остальных задач. При выходе из функции передачи SPI_Xfer(...) флаг блокировки опять устанавливется, тем самым разрешая другой задаче работать с интерфейсом...

Вот только что-то не совсем все это работает. Кто знает, поясните, где я ошибаюсь.

Я думаю, что в логике - в программном протоколе или алгоритме. Логическая схема
обмена (на мой взгляд, поскольку я не знаю деталей) может выглядеть так:

Код
TASK0     TASK1
  |         |
  \         /
   \       /
    \     /
     \   /
      \ /
       |
     DRIVER
       |
       |
  PHY IF (SPI0)
  |         |
  |         |
DEV0      DEV1


следовательно, требуется два мьютекса.

Если учесть что IF последовательный и устройства могут его использовать только
попеременно, то можно обойтись одним мьютексом (или флагом события, что эквивалентно)
и одной условной переменной, т.е. адресом устройства в SPI - в *одной* задаче.

HTH
Go to the top of the page
 
+Quote Post
prottoss
сообщение Feb 7 2008, 15:06
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(AndrewN @ Feb 7 2008, 21:11) *
Я думаю, что в логике - в программном протоколе или алгоритме. Логическая схема обмена (на мой взгляд, поскольку я не знаю деталей) может выглядеть так:
Так как Вы нарисовали, так и есть - есть несколько задач, пытающихся использовать интерфейс, есть флаг захвата интерфейса - который ждут задачи, что бы его использовать... Зачем тока ДВА аж мьютекса? А если у меня будет 32 задачи???


--------------------
Go to the top of the page
 
+Quote Post



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

 


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


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