Перейти к содержанию
    

Ucos ii и Nios II

собрал систему на 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

 

Бьюсь уже неделю не могу понять откуда двойка берется?

Помогите

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

OSInit вызывает HAL до передачи управления main. Вы его повторно, получается, вызвали.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Пытаюсь сделать обработку сообщений с 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;

}

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 UDmitry

Извините, а вы собственно к кому обращаетесь ? :laughing:

 

Писал товарищу qVlad.

 

...Упс, что-то я сначала не понял. Непривычно видеть, что настолько старые вопросы и относительно в топе.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...