|
|
|
Ucos ii и Nios II, не правильно работают флаги |
|
|
|
Feb 10 2010, 13:33
|
Местный
Группа: Свой
Сообщений: 498
Регистрация: 4-10-04
Из: Нижний Новгород
Пользователь №: 771
|
собрал систему на SOPS, написал прогу
#include <stdio.h> #include "includes.h" #include "system.h"
OS_STK Stack[2048]; ALT_FLAG_GRP(Flags);
void Task(void* pdata) { while (true) { OSTimeDlyHMSM(0, 0, 1, 0); fprintf(stderr, "Flags 1 = %04x\n", Flags->OSFlagFlags); ALT_FLAG_POST(Flags, 0x80, OS_FLAG_SET); fprintf(stderr, "Flags 2 = %04x\n", Flags->OSFlagFlags); ALT_FLAG_PEND(Flags, 0x80, OS_FLAG_WAIT_SET_ANY + OS_FLAG_CONSUME, 0); } }
// ********************************************************************* // The main function creates tasks and starts multi-tasking // ********************************************************************* int main(void) { OSInit();
ALT_FLAG_CREATE(&Flagsq, 0);
OSTaskCreateExt( Task, (void*)0, &Stack[2047], 10, 10, Stack, 2048, (void*)0, 0);
OSStart(); return 0; }
так вот при запуске выводит
Flags 1 = 0000 Flags 2 = 0082
Бьюсь уже неделю не могу понять откуда двойка берется? Помогите
--------------------
Человек - это существо, которое охотнее всего рассуждает о том, в чем меньше всего разбирается.
|
|
|
|
|
Feb 15 2011, 15:07
|
Участник
Группа: Участник
Сообщений: 41
Регистрация: 10-01-11
Из: Санкт-Петербург
Пользователь №: 62 125
|
Пытаюсь сделать обработку сообщений с uart через очереди uc/Os-II. В очередь кладутся верные значения,а вот извлекают сообщения "0", хотя их количество уменьшается после извлечения. Например по прерываниям от uart пришли сообщения 45 B0 F1, всего 3 сообщения. при чтении из очереди я 3 раза прочитаю 0. Подскажите что делаю не так.
#include <stdio.h> #include <unistd.h> #include <string.h> #include <stddef.h> #include <stdlib.h> #include "includes.h" #include "alt_ucosii_simple_error_check.h" #include "altera_avalon_pio_regs.h" #include "altera_avalon_sgdma_regs.h" #include "altera_avalon_sgdma.h" #include "altera_avalon_sgdma_descriptor.h" #include "altera_avalon_uart_regs.h"
/* Definition of Task Stacks */ #define TASK_STACKSIZE 2048 OS_STK receive_uart_task_stk[TASK_STACKSIZE];
/* Definition of Task Prioities */ #define INITIALIZE_TASK_PRIORITY 6 #define RECEIVE_UART_PRIORITY 12
/* Definition of Message Queue */ #define MSG_QUEUE_SIZE 30 /*Size of message queue used in example*/ OS_EVENT *msgqueue; /*Message queue pointer */ void *msgqueueTbl[MSG_QUEUE_SIZE];/*Storage for messages*/
/* Local Function Prototypes */ int initOSDataStructs(void); int initCreateTasks(void);
void uart_send_task(void* pdata){ INT8U return_code = OS_NO_ERR; unsigned int msg = 0; OS_Q_DATA queue_data; unsigned short status; status = IORD_ALTERA_AVALON_UART_STATUS(UART_0_BASE); if( status & ALTERA_AVALON_UART_CONTROL_RRDY_MSK) { msg = IORD_ALTERA_AVALON_UART_RXDATA(UART_0_BASE); return_code = OSQQuery(msgqueue, &queue_data); alt_ucosii_check_return_code(return_code);
printf("in msg=%x, num=%d\n",msg,queue_data.OSNMsgs); if(queue_data.OSNMsgs < UART_QUEUE_SIZE) /*Check the number of messages*/ { /*in the message queue*/ return_code = OSQPostOpt(msgqueue, (void *)&msg, OS_POST_OPT_BROADCAST); alt_ucosii_check_return_code(return_code); } else { OSTimeDlyHMSM(0, 0, 1, 0); } } }
void receive_uart_task(void* pdata) { INT8U return_code = OS_NO_ERR; unsigned int *msg; while (1) { msg = (unsigned int *)OSQPend(msgqueue, 0, &return_code); printf("uart_msg=%d,err=%d\n",*msg,return_code); alt_ucosii_check_return_code(return_code); OSTimeDlyHMSM(0, 0, 0, 50); } }
void initialize_task(void* pdata) { INT8U return_code = OS_NO_ERR;
initOSDataStructs(); alt_irq_register (UART_0_IRQ,NULL,uart_send_task); initCreateTasks();
return_code = OSTaskDel(OS_PRIO_SELF); alt_ucosii_check_return_code(return_code); while (1); }
int main (int argc, char* argv[], char* envp[]) { INT8U return_code = OS_NO_ERR;
return_code = OSTaskCreateExt(initialize_task, NULL, (void *)&initialize_task_stk[TASK_STACKSIZE], INITIALIZE_TASK_PRIORITY, INITIALIZE_TASK_PRIORITY, initialize_task_stk, TASK_STACKSIZE, NULL, 0); alt_ucosii_check_return_code(return_code); OSStart(); return 0; }
int initOSDataStructs(void) { msgqueue = OSQCreate(&msgqueueTbl[0], MSG_QUEUE_SIZE); return 0; }
int initCreateTasks(void) { INT8U return_code = OS_NO_ERR; return_code = OSTaskCreateExt(receive_uart_task, NULL, (void *)&receive_uart_task_stk[TASK_STACKSIZE], RECEIVE_UART_PRIORITY, RECEIVE_UART_PRIORITY, receive_uart_task_stk, TASK_STACKSIZE, NULL, 0); alt_ucosii_check_return_code(return_code);
return 0; }
|
|
|
|
|
Jun 13 2015, 10:50
|
Группа: Участник
Сообщений: 13
Регистрация: 28-01-14
Из: Таганрог
Пользователь №: 80 225
|
Вы же в курсе да, что вы передаете и принимаете указатель на элемент, т.е после приёма указателя вы копируете данные, которые хранятся по этому адресу и дальше с ним работаете, а если вы к ним напрямую обращаетесь вам нужно проконтролировать, что данные не изменятся в другом процессе.
|
|
|
|
|
Jun 18 2015, 16:49
|
Группа: Участник
Сообщений: 13
Регистрация: 28-01-14
Из: Таганрог
Пользователь №: 80 225
|
Цитата(Kuzmi4 @ Jun 13 2015, 21:01) 2 UDmitry Извините, а вы собственно к кому обращаетесь ? Писал товарищу qVlad. ...Упс, что-то я сначала не понял. Непривычно видеть, что настолько старые вопросы и относительно в топе.
|
|
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|