hello We have written an application which creates 3 tasks. in the first task (task_task1()) we want to receive some data using a UDP socket. using the file 1.c the socket will be created and bind successfully. But after adding recvfrom() (file 2.c line 79) rtems will crash. The output error messages are in error.txt. We are using rtems-libbsd package and the tasks without the socket in the first one ran without any error. I wonder if any body could help us to solve this problem.
regards, Mojtaba
*** taskes + queues TEST *** nexus0: <RTEMS Nexus device> cgem0: <Cadence CGEM Gigabit Ethernet Interface> on nexus0 miibus0: <MII bus> on cgem0 e1000phy0: <Marvell 88E1512 Gigabit PHY> PHY 0 on miibus0 e1000phy0: none, 10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, 1000baseT-FDX, 1000baseT-FDX-master, auto cgem0: no mac address found, assigning random: 0e:b0:ba:5e:ba:11 info: cgem0: Ethernet address: 0e:b0:ba:5e:ba:11 zy7_slcr0: <Zynq-7000 slcr block> on nexus0 info: lo0: link state changed to UP info: cgem0: link state changed to DOWN add host 172.21.53.19: gateway cgem0 add net default: gateway 172.21.53.19 info: cgem0: link state changed to UP He *** FATAL *** fatal source: 9 (RTEMS_FATAL_SOURCE_EXCEPTION) R0 = 0x002d2940 R8 = 0x0000000b R1 = 0x002d4080 R9 = 0x002d2940 R2 = 0x00215038 R10 = 0x002d4070 R3 = 0x002d4070 R11 = 0x00000000 R4 = 0x00000010 R12 = 0x002d4014 R5 = 0x00000000 SP = 0x002d4010 R6 = 0x00000020 LR = 0x00116a45 R7 = 0x002d4080 PC = 0x00116a5a CPSR = 0x200f0173 VEC = 0x00000004 FPEXC = 0x40000000 FPSCR = 0x00000000 D00 = 0x0000000000000000 D01 = 0x0a0a0a0a0a0a0a0a D02 = 0x1012000010120000 D03 = 0x0000000000000000 D04 = 0x0010000000100002 D05 = 0x0000001000000000 D06 = 0x8040201008040201 D07 = 0x8040201008040201 D08 = 0x0000000000000000 D09 = 0x0000000000000000 D10 = 0x0000000000000000 D11 = 0x0000000000000000 D12 = 0x0000000000000000 D13 = 0x0000000000000000 D14 = 0x0000000000000000 D15 = 0x0000000000000000 D16 = 0x0000000000000000 D17 = 0x0000000000000024 D18 = 0x7ffffffeffffffff D19 = 0xed4000a244c40c4c D20 = 0x1d1f8828f6968353 D21 = 0x8b844000b3790621 D22 = 0x1b04f64213865842 D23 = 0x6236908242634001 D24 = 0x0024250de6893403 D25 = 0x3cf40d2c7e4c0805 D26 = 0xc002402220ff0500 D27 = 0x59fad871ed10278e D28 = 0x0920925fd503240c D29 = 0x41041490170a42ad D30 = 0x00b4037407141002 D31 = 0x277ce208009040ba RTEMS version: 5.0.0.8c66acc8dcb4d459c1f61f2d5f62a23d14e3af46 RTEMS tools: 7.4.1 20190514 (RTEMS 5, RSB be90fb89678206e469f2f9189eb290cec49fd8 27, Newlib 5c2a3661c) executing thread ID: 0x08a01000c executing thread name: TAS1
//#include <machine/rtems-bsd-kernel-space.h> #include <sys/cdefs.h> #include <sys/types.h> #include <sys/event.h> #include <sys/poll.h> #include <sys/stat.h> #include <sys/select.h> #include <sys/socket.h> #include <sys/time.h> #include <sys/filio.h> #include <vm/uma.h> #include <netinet/in.h> #include <arpa/inet.h> #include <err.h> #include <assert.h> #include <errno.h> #include <limits.h> #include <stdbool.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <syslog.h> #include <rtems.h> #include <rtems/bsd/bsd.h> #include <rtems/bsd/modules.h> #include <rtems/libcsupport.h> #include <rtems/bsd/test/network-config.h> #define TEST_NAME "taskes + queues" #define PRIO_HIGH 1 #define PRIO_LOW 5 #define BUFFER_SIZE 32 #define QUEUE_LENGTH 16 #define UDP_RECV_0_PORT 5000 #define UDP_SEND_0_PORT 6000 static const rtems_task_priority task_prios[3] = { 2, 2, 2 }; static const rtems_task_priority queue_prios[2] = { 2, 2}; static rtems_id task_ids[3]; static rtems_id queue_ids[2]; static void set_self_prio(rtems_task_priority prio){ rtems_status_code sc; sc = rtems_task_set_priority(RTEMS_SELF, prio, &prio); assert(sc == RTEMS_SUCCESSFUL); } static void task_task1(rtems_task_argument task_){ printf("Hello from task 1\n"); int sock; struct sockaddr_in addr; char recv_buf[BUFFER_SIZE]; printf("\nHERE %d\n", __LINE__ );fflush(stdout); if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { perror("socket creation failed"); exit(EXIT_FAILURE); } memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_addr.s_addr = INADDR_ANY; addr.sin_port = htons(UDP_RECV_0_PORT); if( bind(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0){ perror("bind failed"); exit(EXIT_FAILURE); } // memset(recv_buf, '\0', BUFFER_SIZE); // int n = recvfrom(sock, recv_buf, BUFFER_SIZE, 0, (struct sockaddr *)&addr, sizeof(addr)); // if( n > 0) { // //printf(recv_buf); // printf("\nrecv_buf = %d", n);fflush(stdout); // rtems_message_queue_send(queue_ids[0],&recv_buf,sizeof(recv_buf)); // } else { // perror("recvfrom");fflush(stdout); // } int n = 0; char data[BUFFER_SIZE]; while (true) { sprintf(data, "data_%d", n); //------------------- recv socket---------------------------------------// rtems_message_queue_send(queue_ids[0],&data,strlen(data)); sleep(1); n++; } } static void task_task2(rtems_task_argument task_){ printf("Hello from task 2\n"); int n = 0; uint32_t size; char data[BUFFER_SIZE]; while (true) { memset(data, '\0', BUFFER_SIZE); rtems_message_queue_get_number_pending(queue_ids[0], &n); if(n > 0){ rtems_message_queue_receive(queue_ids[0], &data, &size, RTEMS_WAIT, RTEMS_MILLISECONDS_TO_TICKS(1000)); //-------------------filter---------------------------------------------// rtems_message_queue_send(queue_ids[1],&data,sizeof(data)); } sleep(1); } } static void task_task3(rtems_task_argument task_){ printf("Hello from task 3\n"); int n = 0; uint32_t size; char data[BUFFER_SIZE + 1]; while (true) { memset(data, '\0', BUFFER_SIZE + 1); rtems_message_queue_get_number_pending(queue_ids[1], &n); if(n > 0){ rtems_message_queue_receive(queue_ids[1], &data, &size, RTEMS_WAIT, RTEMS_MILLISECONDS_TO_TICKS(1000)); //-------------------send socket----------------------------------------// printf("%s\n", data); } sleep(1); } } static void start_tasks(void){ sleep(3); set_self_prio(PRIO_HIGH); rtems_status_code sc; sc = rtems_message_queue_create( rtems_build_name ('Q', 'U', 'E', '0'), QUEUE_LENGTH, BUFFER_SIZE, queue_prios[0], &queue_ids[0] ); assert(sc == RTEMS_SUCCESSFUL); sc = rtems_message_queue_create( rtems_build_name ('Q', 'U', 'E', '1'), QUEUE_LENGTH, BUFFER_SIZE, queue_prios[1], &queue_ids[1] ); assert(sc == RTEMS_SUCCESSFUL); sc = rtems_task_create( rtems_build_name('T', 'A', 'S', '1'), task_prios[0], RTEMS_MINIMUM_STACK_SIZE, RTEMS_DEFAULT_MODES, RTEMS_FLOATING_POINT, &task_ids[0] ); assert(sc == RTEMS_SUCCESSFUL); sc = rtems_task_start(task_ids[0], task_task1, 0); assert(sc == RTEMS_SUCCESSFUL); sc = rtems_task_create( rtems_build_name('T', 'A', 'S', '2'), task_prios[1], RTEMS_MINIMUM_STACK_SIZE, RTEMS_DEFAULT_MODES, RTEMS_FLOATING_POINT, &task_ids[1] ); assert(sc == RTEMS_SUCCESSFUL); sc = rtems_task_start(task_ids[1], task_task2, 1); assert(sc == RTEMS_SUCCESSFUL); sc = rtems_task_create( rtems_build_name('T', 'A', 'S', '3'), task_prios[2], RTEMS_MINIMUM_STACK_SIZE, RTEMS_DEFAULT_MODES, RTEMS_FLOATING_POINT, &task_ids[2] ); assert(sc == RTEMS_SUCCESSFUL); sc = rtems_task_start(task_ids[2], task_task3, 2); assert(sc == RTEMS_SUCCESSFUL); set_self_prio(PRIO_LOW); } static void test_main(void){ start_tasks(); while(true){sleep(1);} exit(0); } #include <rtems/bsd/test/default-network-init.h>
//#include <machine/rtems-bsd-kernel-space.h> #include <sys/cdefs.h> #include <sys/types.h> #include <sys/event.h> #include <sys/poll.h> #include <sys/stat.h> #include <sys/select.h> #include <sys/socket.h> #include <sys/time.h> #include <sys/filio.h> #include <vm/uma.h> #include <netinet/in.h> #include <arpa/inet.h> #include <err.h> #include <assert.h> #include <errno.h> #include <limits.h> #include <stdbool.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <syslog.h> #include <rtems.h> #include <rtems/bsd/bsd.h> #include <rtems/bsd/modules.h> #include <rtems/libcsupport.h> #include <rtems/bsd/test/network-config.h> #define TEST_NAME "taskes + queues" #define PRIO_HIGH 1 #define PRIO_LOW 5 #define BUFFER_SIZE 32 #define QUEUE_LENGTH 16 #define UDP_RECV_0_PORT 5000 #define UDP_SEND_0_PORT 6000 static const rtems_task_priority task_prios[3] = { 2, 2, 2 }; static const rtems_task_priority queue_prios[2] = { 2, 2}; static rtems_id task_ids[3]; static rtems_id queue_ids[2]; static void set_self_prio(rtems_task_priority prio){ rtems_status_code sc; sc = rtems_task_set_priority(RTEMS_SELF, prio, &prio); assert(sc == RTEMS_SUCCESSFUL); } static void task_task1(rtems_task_argument task_){ printf("Hello from task 1\n"); int sock; struct sockaddr_in addr; char recv_buf[BUFFER_SIZE]; printf("\nHERE %d\n", __LINE__ );fflush(stdout); if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { perror("socket creation failed"); exit(EXIT_FAILURE); } memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_addr.s_addr = INADDR_ANY; addr.sin_port = htons(UDP_RECV_0_PORT); if( bind(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0){ perror("bind failed"); exit(EXIT_FAILURE); } memset(recv_buf, '\0', BUFFER_SIZE); int n = recvfrom(sock, recv_buf, BUFFER_SIZE, 0, (struct sockaddr *)&addr, sizeof(addr)); if( n > 0) { //printf(recv_buf); printf("\nrecv_buf = %d", n);fflush(stdout); rtems_message_queue_send(queue_ids[0],&recv_buf,sizeof(recv_buf)); } else { perror("recvfrom");fflush(stdout); } int n = 0; char data[BUFFER_SIZE]; while (true) { sprintf(data, "data_%d", n); //------------------- recv socket---------------------------------------// rtems_message_queue_send(queue_ids[0],&data,strlen(data)); sleep(1); n++; } } static void task_task2(rtems_task_argument task_){ printf("Hello from task 2\n"); int n = 0; uint32_t size; char data[BUFFER_SIZE]; while (true) { memset(data, '\0', BUFFER_SIZE); rtems_message_queue_get_number_pending(queue_ids[0], &n); if(n > 0){ rtems_message_queue_receive(queue_ids[0], &data, &size, RTEMS_WAIT, RTEMS_MILLISECONDS_TO_TICKS(1000)); //-------------------filter---------------------------------------------// rtems_message_queue_send(queue_ids[1],&data,sizeof(data)); } sleep(1); } } static void task_task3(rtems_task_argument task_){ printf("Hello from task 3\n"); int n = 0; uint32_t size; char data[BUFFER_SIZE + 1]; while (true) { memset(data, '\0', BUFFER_SIZE + 1); rtems_message_queue_get_number_pending(queue_ids[1], &n); if(n > 0){ rtems_message_queue_receive(queue_ids[1], &data, &size, RTEMS_WAIT, RTEMS_MILLISECONDS_TO_TICKS(1000)); //-------------------send socket----------------------------------------// printf("%s\n", data); } sleep(1); } } static void start_tasks(void){ sleep(3); set_self_prio(PRIO_HIGH); rtems_status_code sc; sc = rtems_message_queue_create( rtems_build_name ('Q', 'U', 'E', '0'), QUEUE_LENGTH, BUFFER_SIZE, queue_prios[0], &queue_ids[0] ); assert(sc == RTEMS_SUCCESSFUL); sc = rtems_message_queue_create( rtems_build_name ('Q', 'U', 'E', '1'), QUEUE_LENGTH, BUFFER_SIZE, queue_prios[1], &queue_ids[1] ); assert(sc == RTEMS_SUCCESSFUL); sc = rtems_task_create( rtems_build_name('T', 'A', 'S', '1'), task_prios[0], RTEMS_MINIMUM_STACK_SIZE, RTEMS_DEFAULT_MODES, RTEMS_FLOATING_POINT, &task_ids[0] ); assert(sc == RTEMS_SUCCESSFUL); sc = rtems_task_start(task_ids[0], task_task1, 0); assert(sc == RTEMS_SUCCESSFUL); sc = rtems_task_create( rtems_build_name('T', 'A', 'S', '2'), task_prios[1], RTEMS_MINIMUM_STACK_SIZE, RTEMS_DEFAULT_MODES, RTEMS_FLOATING_POINT, &task_ids[1] ); assert(sc == RTEMS_SUCCESSFUL); sc = rtems_task_start(task_ids[1], task_task2, 1); assert(sc == RTEMS_SUCCESSFUL); sc = rtems_task_create( rtems_build_name('T', 'A', 'S', '3'), task_prios[2], RTEMS_MINIMUM_STACK_SIZE, RTEMS_DEFAULT_MODES, RTEMS_FLOATING_POINT, &task_ids[2] ); assert(sc == RTEMS_SUCCESSFUL); sc = rtems_task_start(task_ids[2], task_task3, 2); assert(sc == RTEMS_SUCCESSFUL); set_self_prio(PRIO_LOW); } static void test_main(void){ start_tasks(); while(true){sleep(1);} exit(0); } #include <rtems/bsd/test/default-network-init.h>
_______________________________________________ users mailing list users@rtems.org http://lists.rtems.org/mailman/listinfo/users