Jump to content

    
Sign in to follow this  
Realking

Ucos ii и Nios II

Recommended Posts

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

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

 

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

 

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this