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

 
 
> Разделение ресурса, под 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
Ответов
Chudik
сообщение Feb 24 2008, 07:24
Сообщение #2


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

Группа: Свой
Сообщений: 197
Регистрация: 31-03-06
Пользователь №: 15 676



Я понимаю, что решение найдено. Но я бы повесил очередь запросов (queue). Каждая задача кидает туда номер SPI + указатель на данные. А драйвер считывает очередной запрос и кидает данные из указанной памяти в указанный порт.
Go to the top of the page
 
+Quote Post
sonycman
сообщение Aug 8 2010, 13:17
Сообщение #3


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Цитата(Chudik @ Feb 24 2008, 11:24) *
Но я бы повесил очередь запросов (queue). Каждая задача кидает туда номер SPI + указатель на данные. А драйвер считывает очередной запрос и кидает данные из указанной памяти в указанный порт.

Но тут проблема с указателем на данные - процесс, записавший указатель в очередь, должен хранить сами данные до тех пор, пока драйвер их не передаст.

Весьма не удобно sad.gif

Если записывать в очередь не указатель, а непосредственно сами данные - такой проблемы нет, но тогда нужно иметь много памяти для того, чтобы все данные влезли в очередь...
Go to the top of the page
 
+Quote Post



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

 


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


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