Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Queue и Mbox в uCOS-II.
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы
JeDay
В ф-ю OSMboxPost() OSQPost() передается указатель на передаваемое сообщение. В исходниках ОС я не нашел копирования этого сообщения в промежуточные переменные. Получается когда я посылаю указатель на массив в очередь сообщений, я не могу потом этот массив изменять? Принцып передачи сообщений построен на указателях.

Подскажите как правильно передачу сообщений организовать.
Зараннее благодарен.
Andy Mozzhevilov
Цитата(JeDay @ Nov 3 2005, 21:15) *
В ф-ю OSMboxPost() OSQPost() передается указатель на передаваемое сообщение. В исходниках ОС я не нашел копирования этого сообщения в промежуточные переменные. Получается когда я посылаю указатель на массив в очередь сообщений, я не могу потом этот массив изменять? Принцып передачи сообщений построен на указателях.

Подскажите как правильно передачу сообщений организовать.
Зараннее благодарен.


Обычно память под объект выделяется динамически, а в que передается уже указатель на объект.
После получения это указателя другой задачей данные обрабатываются, а память возвращается в пул.
В uCOS есть модуль OSMem, который работает с блоками фиксированной длины. Это проще и оптимальнее, чем использовать менеджер памяти с блоками переменной длины.
JeDay
Спасибо. Я знаю что есть OSMem. Правда еще не пробовал ими пользоваться.

У меня такой вопрос:
Если я объявил массив А локально(т.е. не через new и delete), посылаю в очередь сообщений, у которого найвысший приоритет, указатель на этот массив. Затем тут же перезаписываю массив А другими данными. После перепланировки другой поток получает сообщение(указатель на массив А) и вычитывает данные, которые уже изменены.

// Task 1 (Найвысший приоритет)
INT8U *A, err;
A = "Hello";
...
err = OSQPost(evQ, (void*)A);
A = "Bad";
//-------------------------------------------

// Task2
INT8U *msg, err;
...
msg = OSQPend(evQ, 0, &err);
//-------------------------------------------
Чему равно msg ? "Hello" или "Bad" ?
Andy Mozzhevilov
Цитата(JeDay @ Nov 7 2005, 16:35) *
// Task 1 (Найвысший приоритет)
INT8U *A, err;
A = "Hello";
...
err = OSQPost(evQ, (void*)A);
A = "Bad";
//-------------------------------------------

// Task2
INT8U *msg, err;
...
msg = OSQPend(evQ, 0, &err);
//-------------------------------------------
Чему равно msg ? "Hello" или "Bad" ?


"Bad" конечно.
_artem_
Net JeDay , sovsem vse naoborot - esli ukazatel (pointer ) izvesten to cerez nego mozno izmenit soderzimoe pomyati na kotoruyu on ukazivaet.

Tvoya programma ze piutaetsya delat izmeneniya v ukazatele a nev v pamyati na kotoruyu ona ssilayetsya :
...
err = OSQPost(evQ, (void*)A);
A = "Bad";
...


Teper o source codes :
OSQPost() naydes v os_q.c. Znacenie ukazatyelya kopiruetsya v ukazatel vnutri OS. Eto soversaetsya v stroke :
*pq->OSQIn++ = msg; /* Insert message into queue */

Structure OS_Q naydes v ucos_ii.h
typedef struct os_q { /* QUEUE CONTROL BLOCK */
struct os_q *OSQPtr; /* Link to next queue control block in list of free blocks */
void **OSQStart; /* Pointer to start of queue data */
void **OSQEnd; /* Pointer to end of queue data */
void **OSQIn; /* Pointer to where next message will be inserted in the Q */
void **OSQOut; /* Pointer to where next message will be extracted from the Q */
INT16U OSQSize; /* Size of queue (maximum number of entries) */
INT16U OSQEntries; /* Current number of entries in the queue */
} OS_Q;


Rekomenduyu pocitat literaturu po ukazatelyam v C - togda vse stanet yasno .


Na vot tebe primer kak ti mozes eto sdelat :

INT8U arr[8], *ptr1;
INT8U *str1 = "Privet";
INT8U *str2 = "Otvali";

ptr1 = arr; // dayes ukazatelu sssilku na pamyat

strcpy(ptr1, str1); // skopiruy pervoe slovo v pamyat
OSQPost(yourque, ptr1); // posilay soobsenie w drugoy task

....

strcpy(ptr1,str2); // skopiruy vtoroe slovo v pamyat
JeDay
Спасибо.

А вообще идея в очередях сообщений какая... При добавлении указателя в очередь я не могу изменять данные на которые он указывает.
Т.е. если я с одного потока ставлю в очередь 20 команд, мне надо объявить 20 указателей и их ставить в очередь ?
Я в тренировочной проге делал один указатель, добавлял его в очередь, а потом сразу же изменял по событию данные и снова ставил в очередь. Так по ходу делать нельзя... ?
_artem_
Конечно же можешь. Я же наверху пример написал, как это делать.
Когда указатель(а точнее его значение) послан в очередь, значение указателя будет переписано в переменную внутри очереди. Но в то же время ты можешь менять память через указатель.

Данные нельзя изменить если операционка поддерживает ММУ (мемору манаджемент юнит) - зашишает память процесса от изменения другим процессом. Но юкос мму не поддерживает .

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

Я у себя по другому делаю - создаю необзодимое количество буферов , и создаю функцию для контроля ими - типа маллок фрее .
когда мне нужно послать команду или что то в этом роде - я схватываю пустой буфер посредством маллок, посылаю его в очередь . На другой стороне когда этот буффер прочитывается приемным процессом , после обработки команды , буффер высвобождается через фрее. Но я Цшные функции маллок не использую - они очень медленные а создаю single linked list так что вец процесс по буферам занимает очень коротокое время .
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.