Я программирую процессор Smartfusion Cortex M3 FPGA, используя протокол SPI для связи по Ethernet.
Я хочу общаться с ПК через сокет (программирование сокетов). так что сервер должен обрабатывать два соединения одновременно, т.е. получение и отправка. Ясно, что я хочу многопоточность (получение и отправка данных одновременно, используя два параллельных потока). Я попытался с помощью примера Hello World с использованием потоков. Однако я не могу получить вывод. Я прошу вас помочь мне выйти из этой проблемы.
НОТА — только используя многопоточность Мне нужно получать выходные данные, используя одновременно только два параллельных потока, чтобы он генерировал средние значения отправки и получения в одном потоке и получения в одном потоке.
Я пробовал с одной нитью и получаю правильный вывод. Пожалуйста, предложите мне шаги для выполнения многопоточности из приведенного ниже кода.
Заранее спасибо.
однопоточный код:
#include "uip.h"#include "psock.h"#include"hello_world.h"#include"pt.h"#include "mss_gpio.h"#include <unistd.h>
#include "./drivers/mss_spi/mss_spi.h"#define INPUT_REG_BASE 0x40050000
#define OUTPUT_REG_BASE 0x40050000
#define OUTPUT_REG_BASE2 0x40050000
#include <stdio.h>
#include <string.h>
#include <semaphore.h>
#include <pthread.h>
#define STATE_OUTPUT 1
#define STATE_INPUT 0
#define ISO_E 0x45
const uint32_t master_tx_frame = 0xAA;
uint32_t* INPUT_IN = (uint32_t*)INPUT_REG_BASE;
uint32_t* OUTPUT_OUT = (uint32_t*)OUTPUT_REG_BASE;
uint32_t* OUTPUT_OUT2 = (uint32_t*)OUTPUT_REG_BASE2;static void handle_connection(struct hello_world_state *s);
static
PT_THREAD(handle_input(struct hello_world_state *s)); // handling input section thread
static
PT_THREAD(handle_output(struct hello_world_state *s)); //output sectionunsigned char temp = 0;
unsigned char str[128];
int size = 128;void hello_world_init(void)
{
uip_listen(HTONS(4002));
}void hello_world_appcall(void)
{
struct hello_world_state *s=(struct hello_world_state *)&(uip_conn->appstate);
if(uip_connected())
{
PSOCK_INIT(&s->pin, s->inputbuffer,sizeof(s->inputbuffer)); //initializing the protosockets
//PSOCK_INIT(&s->pout, s->outputbuffer,sizeof(s->outputbuffer));
}
handle_connection(s);
}static void
handle_connection(struct hello_world_state *s) //calling function
{
if(s->state == STATE_INPUT)
{``
handle_input(s);
}
}static
PT_THREAD(handle_input(struct hello_world_state *s)) //input function
{
PSOCK_BEGIN(&s->pin);
//PSOCK_SEND_STR(&s->p, "Hi.what is there name?\n");
//PSOCK_READTO(&s->p, '\n');
PSOCK_READBUF (&s->pin);
//PSOCK_SEND_STR(&s->pin, "HI");
PSOCK_SEND(&s->pin, s->inputbuffer,sizeof(s->inputbuffer));
if(s->inputbuffer[0] == 0xAC)
{
MSS_SPI_set_slave_select(&g_mss_spi0, MSS_SPI_SLAVE_0); //spi interfacing by using threads
MSS_SPI_transfer_frame(&g_mss_spi0, s->inputbuffer[4]);
MSS_SPI_clear_slave_select(&g_mss_spi0, MSS_SPI_SLAVE_0);
MSS_SPI_set_slave_select(&g_mss_spi1, MSS_SPI_SLAVE_0);
MSS_SPI_transfer_frame(&g_mss_spi1, s->inputbuffer[4]);
MSS_SPI_clear_slave_select(&g_mss_spi1, MSS_SPI_SLAVE_0);
}
else{
PSOCK_CLOSE(&s->pin);
PSOCK_END(&s->pin);
}}
static PT_THREAD(handle_output(struct hello_world_state *s)) //output thread function
{
PSOCK_BEGIN(&s->pout);
PSOCK_SEND_STR(&s->pout,"HIIIIII");
PSOCK_CLOSE(&s->pout);
PSOCK_END(&s->pout);
}
Задача ещё не решена.
Других решений пока нет …