Jump to content

    

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

 

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

Помогите

Share this post


Link to post
Share on other sites

заремил OSInit() и все стало в норме

Че за ерунда

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

}

 

 

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

2 UDmitry

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

Share this post


Link to post
Share on other sites
2 UDmitry

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

 

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

 

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this