int main(void) { int wnum1 = 1; td_monitor tdm1; tdm_init(&tdm1, worker, &wnum1); int wnum2 = 2; td_monitor tdm2; tdm_init_shared(&tdm2, &tdm1, NULL, worker, &wnum2); for (int i=0; i<16; ++i) { char *message = malloc(sizeof(char)*25); sprintf(message, "hello %d from main", i); tdm_post_to_worker(&tdm1, message); message = NULL; char *returned = (char*)tdm_get_from_worker(&tdm1); if (returned == NULL) { printf("nothing in queue currently\n"); } else { printf("main got message \"%s\" from worker\n", returned); free(returned); } } tdm_worker_exit(&tdm1); tdm_worker_exit(&tdm2); tdm_join(&tdm1); tdm_join(&tdm2); printf("clearing to worker queue\n"); tdm_clear_to_worker_queue(&tdm1, free_func, NULL); printf("clearing from worker queues\n"); tdm_clear_from_worker_queue(&tdm1, free_func, NULL); tdm_clear_from_worker_queue(&tdm2, free_func, NULL); tdm_destroy(&tdm1); tdm_destroy(&tdm2); }
static void radio_init(void) { __pdata uint32_t freq_min, freq_max; __pdata uint32_t channel_spacing; __pdata uint8_t txpower; // Do generic PHY initialisation if (!radio_initialise()) { panic("radio_initialise failed"); } switch (g_board_frequency) { case FREQ_433: freq_min = 433050000UL; freq_max = 434790000UL; txpower = 10; num_fh_channels = 10; break; case FREQ_470: freq_min = 470000000UL; freq_max = 471000000UL; txpower = 10; num_fh_channels = 10; break; case FREQ_868: freq_min = 868000000UL; freq_max = 869000000UL; txpower = 10; num_fh_channels = 10; break; case FREQ_915: freq_min = 915000000UL; freq_max = 928000000UL; txpower = 20; num_fh_channels = MAX_FREQ_CHANNELS; break; default: freq_min = 0; freq_max = 0; txpower = 0; panic("bad board frequency %d", g_board_frequency); break; } if (param_get(PARAM_NUM_CHANNELS) != 0) { num_fh_channels = param_get(PARAM_NUM_CHANNELS); } if (param_get(PARAM_MIN_FREQ) != 0) { freq_min = param_get(PARAM_MIN_FREQ) * 1000UL; } if (param_get(PARAM_MAX_FREQ) != 0) { freq_max = param_get(PARAM_MAX_FREQ) * 1000UL; } if (param_get(PARAM_TXPOWER) != 0) { txpower = param_get(PARAM_TXPOWER); } // constrain power and channels txpower = constrain(txpower, BOARD_MINTXPOWER, BOARD_MAXTXPOWER); num_fh_channels = constrain(num_fh_channels, 1, MAX_FREQ_CHANNELS); // double check ranges the board can do switch (g_board_frequency) { case FREQ_433: freq_min = constrain(freq_min, 414000000UL, 460000000UL); freq_max = constrain(freq_max, 414000000UL, 460000000UL); break; case FREQ_470: freq_min = constrain(freq_min, 450000000UL, 490000000UL); freq_max = constrain(freq_max, 450000000UL, 490000000UL); break; case FREQ_868: freq_min = constrain(freq_min, 849000000UL, 889000000UL); freq_max = constrain(freq_max, 849000000UL, 889000000UL); break; case FREQ_915: freq_min = constrain(freq_min, 868000000UL, 935000000UL); freq_max = constrain(freq_max, 868000000UL, 935000000UL); break; default: panic("bad board frequency %d", g_board_frequency); break; } if (freq_max == freq_min) { freq_max = freq_min + 1000000UL; } // get the duty cycle we will use duty_cycle = param_get(PARAM_DUTY_CYCLE); duty_cycle = constrain(duty_cycle, 0, 100); param_set(PARAM_DUTY_CYCLE, duty_cycle); // get the LBT threshold we will use lbt_rssi = param_get(PARAM_LBT_RSSI); if (lbt_rssi != 0) { // limit to the RSSI valid range lbt_rssi = constrain(lbt_rssi, 25, 220); } param_set(PARAM_LBT_RSSI, lbt_rssi); // sanity checks param_set(PARAM_MIN_FREQ, freq_min/1000); param_set(PARAM_MAX_FREQ, freq_max/1000); param_set(PARAM_NUM_CHANNELS, num_fh_channels); channel_spacing = (freq_max - freq_min) / (num_fh_channels+2); // add half of the channel spacing, to ensure that we are well // away from the edges of the allowed range freq_min += channel_spacing/2; // add another offset based on network ID. This means that // with different network IDs we will have much lower // interference srand(param_get(PARAM_NETID)); if (num_fh_channels > 5) { freq_min += ((unsigned long)(rand()*625)) % channel_spacing; } debug("freq low=%lu high=%lu spacing=%lu\n", freq_min, freq_min+(num_fh_channels*channel_spacing), channel_spacing); // set the frequency and channel spacing // change base freq based on netid radio_set_frequency(freq_min); // set channel spacing radio_set_channel_spacing(channel_spacing); // start on a channel chosen by network ID radio_set_channel(param_get(PARAM_NETID) % num_fh_channels); // And intilise the radio with them. if (!radio_configure(param_get(PARAM_AIR_SPEED)) && !radio_configure(param_get(PARAM_AIR_SPEED)) && !radio_configure(param_get(PARAM_AIR_SPEED))) { panic("radio_configure failed"); } // report the real air data rate in parameters param_set(PARAM_AIR_SPEED, radio_air_rate()); // setup network ID radio_set_network_id(param_get(PARAM_NETID)); // setup transmit power radio_set_transmit_power(txpower); // report the real transmit power in settings param_set(PARAM_TXPOWER, radio_get_transmit_power()); #ifdef USE_RTC // initialise real time clock rtc_init(); #endif // initialise frequency hopping system fhop_init(param_get(PARAM_NETID)); // initialise TDM system tdm_init(); }