int main(int argc, char ** argv) { int i=0; assert(argc == 1); res[0].type = RECONOS_TYPE_SEM; res[0].ptr = &sem_a; res[1].type = RECONOS_TYPE_SEM; res[1].ptr = &sem_b; sem_init(&sem_a,0,0); sem_init(&sem_b,0,0); reconos_init_autodetect(); reconos_hwt_setresources(&hwt,res,2); reconos_hwt_create(&hwt,0,NULL); for(i=0; i<100; i++) { sem_post(&sem_a); printf("%03d: posted semaphore a ... ", i+1); sem_wait(&sem_b); printf("received semaphore b\n"); } //pthread_join(hwt.delegate,NULL); return 0; }
int main(int argc, char ** argv) { int i=0,j; printf("%d\n",argc); assert(argc == 1); res[0].type = RECONOS_TYPE_MUTEX; res[0].ptr = &mutex_a; res[1].type = RECONOS_TYPE_COND; res[1].ptr = &condvar_a; res[2].type = RECONOS_TYPE_MUTEX; res[2].ptr = &mutex_b; res[3].type = RECONOS_TYPE_COND; res[3].ptr = &condvar_b; printf("begin condvar_test_posix\n"); // initialize mutexes with default attributes pthread_mutex_init(&mutex_a, NULL); pthread_mutex_init(&mutex_b, NULL); pthread_cond_init(&condvar_a, NULL); pthread_cond_init(&condvar_b, NULL); // create software thread pthread_create(&swthread,NULL,wait_on_condvar,NULL); // create hardware thread printf("creating hw thread... "); reconos_init_autodetect(); reconos_hwt_setresources(&hwt,res,4); reconos_hwt_create(&hwt,0,NULL); printf("ok\n"); // give the second sw thread some time to run... for(j=0; j<10; j++) { usleep(1000); } for(i = 0; i < 10; i++){ pthread_mutex_lock(&mutex_a); printf("signaling condition a\n"); pthread_cond_signal(&condvar_a); pthread_mutex_unlock(&mutex_a); for(j=0; j<10; j++) { usleep(1000); } } printf("condvar_test_posix done.\n"); //pthread_join(hwt.delegate,NULL); return 0; }
int main(int argc, char ** argv) { uint32 ret = 0; assert(argc == 1); res[0].type = RECONOS_TYPE_MBOX; res[0].ptr = &mb_1; mbox_init(&mb_1,3); reconos_init_autodetect(); reconos_hwt_setresources(&hwt,res,2); reconos_hwt_setinitdata(&hwt,(void *) init_data); reconos_hwt_create(&hwt,0,NULL); ret = mbox_get(&mb_1); if (ret==init_data) printf("get_init_data: success (%X=%X)\n", init_data,ret); else printf("get_init_data: failure (%X!=%X)\n",init_data,ret); pthread_join(hwt.delegate,NULL); return 0; }
static int __init init_reconos_test_module(void) { uint32_t ret = 0; mbox_init(&mb, 3); reconos_init_autodetect(); reconos_hwt_setresources(&hwt, &res, 1); reconos_hwt_setinitdata(&hwt, (void *) init_data); reconos_hwt_create(&hwt, 0, NULL); ret = mbox_get(&mb); if (ret == init_data) printk(KERN_INFO "[reconos-test] get_init_data: " "success (%X=%X)\n", init_data, ret); else printk(KERN_INFO "[reconos-test] get_init_data: " "failure (%X!=%X)\n", init_data, ret); printk("[reconos-test] loaded, test done\n"); return 0; }
static int __init init_reconos_test_module(void) { char * shared_mem_h2s; char * shared_mem_s2h; int i, j; long unsigned jiffies_before; long unsigned jiffies_after; int len_array[13] = {64, 128, 256, 512, 1024, 1280, 1500, 3000, 6000, 9000, 15000, 30000, 50000}; printk(KERN_INFO "[reconos-interface] Init.\n"); mbox_init(&e_mb_put, 2); mbox_init(&e_mb_get, 2); mbox_init(&a_mb_put, 2); mbox_init(&a_mb_get, 2); mbox_init(&b_mb_put, 2); mbox_init(&b_mb_get, 2); mbox_init(&c_mb_put, 2); mbox_init(&c_mb_get, 2); printk(KERN_INFO "[reconos-interface] mbox_init done, starting autodetect.\n"); reconos_init_autodetect(); printk(KERN_INFO "[reconos-interface] Creating hw-thread.\n"); e_res[0].type = RECONOS_TYPE_MBOX; e_res[0].ptr = &e_mb_put; e_res[1].type = RECONOS_TYPE_MBOX; e_res[1].ptr = &e_mb_get; a_res[0].type = RECONOS_TYPE_MBOX; a_res[0].ptr = &a_mb_put; a_res[1].type = RECONOS_TYPE_MBOX; a_res[1].ptr = &a_mb_get; s_res[0].type = RECONOS_TYPE_MBOX; s_res[0].ptr = &s_mb_put; s_res[1].type = RECONOS_TYPE_MBOX; s_res[1].ptr = &s_mb_get; b_res[0].type = RECONOS_TYPE_MBOX; b_res[0].ptr = &b_mb_put; b_res[1].type = RECONOS_TYPE_MBOX; b_res[1].ptr = &b_mb_get; c_res[0].type = RECONOS_TYPE_MBOX; c_res[0].ptr = &c_mb_put; c_res[1].type = RECONOS_TYPE_MBOX; c_res[1].ptr = &c_mb_get; reconos_hwt_setresources(&e_hwt,e_res,2); reconos_hwt_create(&e_hwt,E_HWT_SLOT_NR,NULL); reconos_hwt_setresources(&a_hwt,a_res,2); reconos_hwt_create(&a_hwt,A_HWT_SLOT_NR,NULL); reconos_hwt_setresources(&b_hwt,b_res,2); reconos_hwt_create(&b_hwt,B_HWT_SLOT_NR,NULL); reconos_hwt_setresources(&c_hwt,c_res,2); reconos_hwt_create(&c_hwt,C_HWT_SLOT_NR,NULL); //setup the hw -> sw thread printk(KERN_INFO "[reconos-interface] Allocate memory\n"); shared_mem_h2s = __get_free_pages(GFP_KERNEL | __GFP_NOWARN, 4); //allocate 2² pages get_zeroed_page(GFP_KERNEL); printk(KERN_INFO "[reconos-interface] h2s memory %p\n", shared_mem_h2s); mbox_put(&b_mb_put, shared_mem_h2s); //setup the sw -> hw thread shared_mem_s2h = __get_free_pages(GFP_KERNEL | __GFP_NOWARN, 4); //allocate 2² pages get_zeroed_page(GFP_KERNEL); printk(KERN_INFO "[reconos-interface] s2h memory %p\n", shared_mem_s2h); mbox_put(&c_mb_put, shared_mem_s2h); printk(KERN_INFO "[reconos-interface] HZ= %d\n", HZ); jiffies_before = jiffies; printk(KERN_INFO "[reconos-interface] Setting up AES slot \n"); u32 config_data_start=1; u32 config_rcv=0; u32 config_data_mode=0; //"....1100"=12=mode128, mode192=13, mode256=14,15 u32 config_data_key0=0x16157e2b; // 50462976; //X"03020100" u32 config_data_key1=0xa6d2ae28; //117835012; //X"07060504" u32 config_data_key2=0x8815f7ab; //185207048; //X"0b0a0908" u32 config_data_key3=0x3c4fcf09; //252579084; //X"0f0e0d0c" u32 config_data_key4=319951120; //X"13121110" u32 config_data_key5=387323156; //X"17161514" u32 config_data_key6=454695192; //X"1b1a1918" u32 config_data_key7=522067228; //X"1f1e1d1c" u32 exit_sig=4294967295; // config_data_mode=16; //key length 128 bit, send everything to eth config_data_mode=20; //key length 128 bit, send everything to sw mbox_put(&e_mb_put, config_data_start); mbox_put(&e_mb_put, config_data_mode); mbox_put(&e_mb_put, config_data_key0); mbox_put(&e_mb_put, config_data_key1); mbox_put(&e_mb_put, config_data_key2); mbox_put(&e_mb_put, config_data_key3); mbox_put(&e_mb_put, config_data_key4); mbox_put(&e_mb_put, config_data_key5); mbox_put(&e_mb_put, config_data_key6); mbox_put(&e_mb_put, config_data_key7); config_rcv=mbox_get(&e_mb_get); printk(KERN_INFO "[reconos-interface] AES Setup done\n"); while(1){ printk(KERN_INFO "waiting for hw packets \n"); int ret = mbox_get(&b_mb_get); int i; for (i = 0; i < 100; i+=4) printk(KERN_INFO "%x %x %x %x\n", shared_mem_h2s[i], shared_mem_h2s[i+1], shared_mem_h2s[i+2], shared_mem_h2s[i+3]); printk(KERN_INFO "received packet of len %u\n", ret); mbox_put(&b_mb_put, shared_mem_h2s ); printk(KERN_INFO "setting up hash table \n"); //config eth u32 config_eth_hash_1 = 0xabababab; u32 config_eth_hash_2 = 0xabababab; u32 config_eth_idp = 0x12341234; u32 config_eth_address = 1; //global 0, local 1 -> aes mbox_put(&a_mb_put, config_eth_hash_1 ); mbox_put(&a_mb_put, config_eth_hash_2); mbox_put(&a_mb_put, config_eth_idp); mbox_put(&a_mb_put, config_eth_address); ret = mbox_get(&a_mb_get); printk(KERN_INFO "hwt_ethernet configured - 1\n"); config_eth_hash_1 = 0xabababab; config_eth_hash_2 = 0xababab01; config_eth_idp = 0x56785678; config_eth_address = 5; //global 1, local 1 -> h2s mbox_put(&a_mb_put, config_eth_hash_1 ); mbox_put(&a_mb_put, config_eth_hash_2); mbox_put(&a_mb_put, config_eth_idp); mbox_put(&a_mb_put, config_eth_address); ret = mbox_get(&a_mb_get); printk(KERN_INFO "hwt_ethernet configured - 2\n"); ret = mbox_get(&b_mb_get); for (i = 0; i < 100; i+=4) printk(KERN_INFO "%x %x %x %x\n", shared_mem_h2s[i], shared_mem_h2s[i+1], shared_mem_h2s[i+2], shared_mem_h2s[i+3]); printk(KERN_INFO "received packet of len %u\n", ret); mbox_put(&b_mb_put, shared_mem_h2s ); //config eth config_eth_hash_1 = 0xabababab; config_eth_hash_2 = 0xabababab; config_eth_idp = 0x12341234; config_eth_address = 5; //global 1, local 1 -> h2s mbox_put(&a_mb_put, config_eth_hash_1 ); mbox_put(&a_mb_put, config_eth_hash_2); mbox_put(&a_mb_put, config_eth_idp); mbox_put(&a_mb_put, config_eth_address); ret = mbox_get(&a_mb_get); printk(KERN_INFO "hwt_ethernet configured - 3\n"); } #ifdef ADD //get interrupt time mbox_put(&e_mb_put, shared_mem_s2h); /************************************** * only interrupts **************************************/ u32 data = 2147483648; int iterations = 1; jiffies_before = jiffies; for(i= data; i < data + iterations; i++){ mbox_put(&e_mb_put, i); int ret = mbox_get(&e_mb_get); jiffies_after = jiffies; // printk(KERN_INFO "put %d, ret %d\n", i, ret); } jiffies_after = jiffies; printk(KERN_INFO "[reconos-interface] only interrupts: delta (in jiffies) = %lu for %d iterations", jiffies_after - jiffies_before, iterations); /*********************************************************************** * len = 64, 128, 512, 1024, 1280, 1518, 3000, 6000, 9000, 12000, 15000 **********************************************************************/ for (j = 11; j < 13; j++){ int len = len_array[j]; printk(KERN_INFO "len = %d %p\n", len, shared_mem_s2h); memset(shared_mem_s2h, 0, 2*len); printk(KERN_INFO "len = %d\n", len); iterations = 1000000; jiffies_before = jiffies; for(i=0; i < iterations; i++){ mbox_put(&e_mb_put, len); mbox_get(&e_mb_get); } jiffies_after = jiffies; int ret = memcmp(shared_mem_s2h, shared_mem_s2h+len, len); if (ret == 0) printk(KERN_INFO "copy success\n"); else printk(KERN_INFO " copy failed\n"); printk(KERN_INFO "[reconos-interface] len = %d: delta = %lu", len, jiffies_after - jiffies_before); } //#endif /**************************************** * Reconfigure ETH to send data to dummy ****************************************/ u32 config_data = 1; //global=0, local=1 mbox_put(&a_mb_put, config_data); #endif #ifdef SW_APP // for(i = 0; i < 10000; i++) { for (j = 0; j < 7; j++){ int packet_len = len_array[j]; int iterations = 100000; int j = 0; int result = 0; memset(shared_mem_s2h, 0, 2 * packet_len); /************************************ * send packet to hardware ************************************/ copy_packet(packet_len, 1, shared_mem_s2h, 1, 0); jiffies_before = jiffies; for(i = 0; i < iterations; i++){ mbox_put(&c_mb_put, packet_len + 12); result = mbox_get(&c_mb_get); } jiffies_after = jiffies; printk(KERN_INFO "[reconos-interface] iterations = %d len = %d: delta = %lu", iterations, packet_len, jiffies_after - jiffies_before); } } #endif #ifdef old /************************************ * send packet to hardware ************************************/ copy_packet(packet_len, 2, shared_mem_s2h, 1, 1); struct noc_pkt * snd_pkt = (struct noc_pkt *)shared_mem_s2h; mbox_put(&c_mb_put, packet_len); //printk(KERN_INFO "[reconos-interface] packet sent to hw\n"); result = mbox_get(&c_mb_get); printk(KERN_INFO "[reconos-interface] packet sent received ack from hw, total packet len %d \n", result); /************************************ * receive packet from hardware ************************************/ //printk(KERN_INFO "[reconos-interface] wait for packet from hw\n"); result = mbox_get(&b_mb_get); struct noc_pkt * rcv_pkt = (struct noc_pkt *)shared_mem_h2s; // packet_len = *(int *)shared_mem_h2s; printk(KERN_INFO "[reconos-interface] packet received with len from mbox %d, from memory %d\n", result, rcv_pkt->payload_len); printk(KERN_INFO "packet sent\n"); print_packet(snd_pkt); printk(KERN_INFO "packet received\n"); print_packet(rcv_pkt); for (j = 0; j < packet_len + 12; j++){ unsigned char written_val = shared_mem_s2h[j]; unsigned char read_val = shared_mem_h2s[j]; printk(KERN_INFO "%x %x", written_val, read_val); if ((j + 1) % 8 == 0){ printk(KERN_INFO " "); } if ((j + 1) % 16 == 0){ printk(KERN_INFO "\n"); } } printk(KERN_INFO "\n"); mbox_put(&b_mb_put, shared_mem_h2s); //dummy_value. it will be the amount of data read in a ring buffer scenario /********************************************** * send packet to hardware (s2h -> ADD -> eth) **********************************************/ copy_packet(packet_len, 3, shared_mem_s2h, 0, 1); mbox_put(&c_mb_put, packet_len); //printk(KERN_INFO "[reconos-interface] packet sent to hw\n"); result = mbox_get(&c_mb_get); printk(KERN_INFO "[reconos-interface] packet sent received ack from hw, total packet len %d \n", result); /*************************************** * reconfigure ADD to send packet to SW ***************************************/ u32 config_data = 5; //global=1, local=1 mbox_put(&e_mb_put, config_data); config_data = mbox_get(&e_mb_get); printk(KERN_INFO "ADD replies : %d\n", config_data); config_data = mbox_get(&e_mb_get); printk(KERN_INFO "ADD replies : %d\n", config_data); config_data = mbox_get(&e_mb_get); printk(KERN_INFO "ADD replies : %d\n", config_data); config_data = mbox_get(&e_mb_get); printk(KERN_INFO "ADD replies : %d\n", config_data); config_data = mbox_get(&e_mb_get); printk(KERN_INFO "ADD replies : %d\n", config_data); /********************************************** * send packet to hardware (s2h -> ADD -> h2s) **********************************************/ copy_packet(packet_len, 4, shared_mem_s2h, 0, 1); mbox_put(&c_mb_put, packet_len); //printk(KERN_INFO "[reconos-interface] packet sent to hw\n"); result = mbox_get(&c_mb_get); printk(KERN_INFO "[reconos-interface] packet sent received ack from hw, total packet len %d \n", result); /************************************ * receive packet from hardware (ADD) ************************************/ //printk(KERN_INFO "[reconos-interface] wait for packet from hw\n"); result = mbox_get(&b_mb_get); rcv_pkt = (struct noc_pkt *)shared_mem_h2s; // packet_len = *(int *)shared_mem_h2s; printk(KERN_INFO "[reconos-interface] packet received with len from mbox %d, from memory %d\n", result, rcv_pkt->payload_len); printk(KERN_INFO "packet sent\n"); print_packet(snd_pkt); printk(KERN_INFO "packet received\n"); print_packet(rcv_pkt); for (j = 0; j < packet_len + 12; j++){ unsigned char written_val = shared_mem_s2h[j]; unsigned char read_val = shared_mem_h2s[j]; printk(KERN_INFO "%x %x", written_val, read_val); if ((j + 1) % 8 == 0){ printk(KERN_INFO " "); } if ((j + 1) % 16 == 0){ printk(KERN_INFO "\n"); } } printk(KERN_INFO "\n"); mbox_put(&b_mb_put, shared_mem_h2s); //dummy_value. it will be the amount of data read in a ring buffer scenario /************************************ * receive packet from hardware (ETH -> h2s) ************************************/ //printk(KERN_INFO "[reconos-interface] wait for packet from hw\n"); result = mbox_get(&b_mb_get); rcv_pkt = (struct noc_pkt *)shared_mem_h2s; // packet_len = *(int *)shared_mem_h2s; printk(KERN_INFO "[reconos-interface] packet received with len from mbox %d, from memory %d\n", result, rcv_pkt->payload_len); printk(KERN_INFO "packet sent\n"); print_packet(snd_pkt); printk(KERN_INFO "packet received\n"); print_packet(rcv_pkt); for (j = 0; j < packet_len + 12; j++){ unsigned char written_val = shared_mem_s2h[j]; unsigned char read_val = shared_mem_h2s[j]; printk(KERN_INFO "%x %x", written_val, read_val); if ((j + 1) % 8 == 0){ printk(KERN_INFO " "); } if ((j + 1) % 16 == 0){ printk(KERN_INFO "\n"); } } printk(KERN_INFO "\n"); mbox_put(&b_mb_put, shared_mem_h2s); //dummy_value. it will be the amount of data read in a ring buffer scenario /***************************************** * Reconfigure ETH to send packets to ADD *****************************************/ struct config_data config; config.dst_idp = 170; config.src_idp = 187; config.latency_critical = 1; config.direction = 0; //0 = ingress config.priority = 1; config.global_addr = 0; config.local_addr = 1; mbox_put(&a_mb_put, config_data); config_data = mbox_get(&a_mb_get); printk(KERN_INFO "ADD replies : %d\n", config_data); config_data = mbox_get(&a_mb_get); printk(KERN_INFO "ADD replies : %d\n", config_data); /************************************ * receive packet from hardware (ETH -> ADD -> h2s) ************************************/ //printk(KERN_INFO "[reconos-interface] wait for packet from hw\n"); result = mbox_get(&b_mb_get); rcv_pkt = (struct noc_pkt *)shared_mem_h2s; // packet_len = *(int *)shared_mem_h2s; printk(KERN_INFO "[reconos-interface] packet received with len from mbox %d, from memory %d\n", result, rcv_pkt->payload_len); printk(KERN_INFO "packet sent\n"); print_packet(snd_pkt); printk(KERN_INFO "packet received\n"); print_packet(rcv_pkt); for (j = 0; j < packet_len + 12; j++){ unsigned char written_val = shared_mem_s2h[j]; unsigned char read_val = shared_mem_h2s[j]; printk(KERN_INFO "%x %x", written_val, read_val); if ((j + 1) % 8 == 0){ printk(KERN_INFO " "); } if ((j + 1) % 16 == 0){ printk(KERN_INFO "\n"); } } printk(KERN_INFO "\n"); mbox_put(&b_mb_put, shared_mem_h2s); //dummy_value. it will be the amount of data read in a ring buffer scenario }
int main(int argc, char ** argv) { int i; int hw_threads; // we have exactly 3 arguments now... hw_threads = 4; // init mailboxes mbox_init(&mb_start,MBOX_SIZE); mbox_init(&mb_stop ,MBOX_SIZE); // init reconos and communication resources reconos_init_autodetect(); res[0].type = RECONOS_TYPE_MBOX; res[0].ptr = &mb_start; res[1].type = RECONOS_TYPE_MBOX; res[1].ptr = &mb_stop; printf("Creating %i hw-threads: ", hw_threads); fflush(stdout); for (i = 0; i < hw_threads; i++) { printf(" %i",i);fflush(stdout); reconos_hwt_setresources(&(hwt[i]),res,2); reconos_hwt_create(&(hwt[i]),i,NULL); } printf("\n"); int addresses[4]; addresses[0] = 0; addresses[1] = 1; addresses[2] = 16; addresses[3] = 17; i = 0; while(1) { i = (i+1) % 4; printf("Waiting"); fflush(stdout); int j; for(j=0; j<5; j++) { printf("."); fflush(stdout); sleep(1); } printf("\n"); printf("Sending command\n"); fflush(stdout); mbox_put(&mb_start,addresses[i]); printf("Waiting for answer\n"); fflush(stdout); mbox_get(&mb_stop); printf("Answer received\n"); printf("Waiting for answer\n"); fflush(stdout); mbox_get(&mb_stop); printf("Answer received\n"); } return 0; }