threads dont overflow anymore, still hangs at random counts of sent beacon packets

This commit is contained in:
Stephan Arndt 2013-03-18 19:22:07 +01:00
parent adfc3306ab
commit 5a2bc468c4
3 changed files with 21 additions and 65 deletions

View File

@ -13,7 +13,7 @@ void hard_reset_to_bootloader(void)
getchar(); getchar();
*/ */
printf("Reset CPU (into bootloader)\r\n"); printf("Reset CPU (into bootloader)\r\n");
set_rts(0); // RTS (ttl level) connects to P0.14 set_rts(1); // RTS (ttl level) connects to P0.14
/* the next two lines should be commented for the prepared node */ /* the next two lines should be commented for the prepared node */
set_dtr(1); // DTR (ttl level) connects to RST set_dtr(1); // DTR (ttl level) connects to RST
send_break_signal(); // or break detect circuit to RST send_break_signal(); // or break detect circuit to RST
@ -24,14 +24,14 @@ void hard_reset_to_bootloader(void)
*/ */
set_dtr(0); // allow the CPU to run: set_dtr(0); // allow the CPU to run:
set_baud(baud_rate); set_baud(baud_rate);
set_rts(0); // set RTS again (as it has been reset by set_baudrate) set_rts(1); // set RTS again (as it has been reset by set_baudrate)
usleep(40000); usleep(40000);
} }
void hard_reset_to_user_code(void) void hard_reset_to_user_code(void)
{ {
printf("Reset CPU (into user code)\r\n"); printf("Reset CPU (into user code)\r\n");
set_rts(1); // RTS (ttl level) connects to P0.14 set_rts(0); // RTS (ttl level) connects to P0.14
set_dtr(1); // DTR (ttl level) connects to RST set_dtr(1); // DTR (ttl level) connects to RST
send_break_signal(); // or break detect circuit to RST send_break_signal(); // or break detect circuit to RST
usleep(75000); usleep(75000);

View File

@ -59,6 +59,7 @@ void init(char *str){
void table(char *str){ void table(char *str){
thread_print_all(); thread_print_all();
show_candidates();
} }
const shell_command_t shell_commands[] = { const shell_command_t shell_commands[] = {

View File

@ -75,6 +75,8 @@ static etx_probe_t * get_etx_rec_buf(void) {
//TODO delete //TODO delete
void etx_beacon2(void); void etx_beacon2(void);
void etx_radio2(void);
void show_candidates(void) { void show_candidates(void) {
//TODO delete //TODO delete
/* /*
@ -104,79 +106,34 @@ void show_candidates(void) {
void etx_init_beaconing(ipv6_addr_t * address) { void etx_init_beaconing(ipv6_addr_t * address) {
own_address = address; own_address = address;
show_candidates(); //set code
//set code
printf("ETX BEACON INIT"); printf("ETX BEACON INIT");
etx_send_buf[0] = ETX_BEACON; etx_send_buf[0] = ETX_BEACON;
thread_print_all(); thread_print_all();
// etx_beacon_pid = thread_create(etx_beacon_buf, ETX_BEACON_STACKSIZE, etx_beacon_pid = thread_create(etx_beacon_buf, ETX_BEACON_STACKSIZE,
// PRIORITY_MAIN - 1, CREATE_STACKTEST, PRIORITY_MAIN - 1, CREATE_STACKTEST,
// etx_beacon2, "etx_beacon"); etx_beacon, "etx_beacon");
etx_radio_pid = thread_create(etx_radio_buf, ETX_RADIO_STACKSIZE, etx_radio_pid = thread_create(etx_radio_buf, ETX_RADIO_STACKSIZE,
PRIORITY_MAIN - 1, CREATE_STACKTEST, PRIORITY_MAIN - 1, CREATE_STACKTEST,
etx_radio, "etx_radio"); etx_radio, "etx_radio");
printf("etx radio pid is %d", etx_radio_pid);
/* /*
* Maybe this should not be in a seperate thread resource-wise, but the * Maybe this should not be in a seperate thread resource-wise, but the
* motive was to delay beacon-sending as little as possible, as this would * motive was to delay beacon-sending as little as possible, as this would
* derail beaconing from the intended ETX_INTERVAL. * derail beaconing from the intended ETX_INTERVAL.
*/ */
//TODO delete
show_candidates();
etx_update_pid = thread_create(etx_update_buf, ETX_UPDT_STACKSIZE, etx_update_pid = thread_create(etx_update_buf, ETX_UPDT_STACKSIZE,
PRIORITY_MAIN - 1, CREATE_STACKTEST, PRIORITY_MAIN - 1, CREATE_STACKTEST,
etx_update, "etx_update"); etx_update, "etx_update");
//TODO delete
show_candidates();
//TODO delete
thread_wakeup(etx_update_pid);
//register at transceiver //register at transceiver
transceiver_register(TRANSCEIVER_CC1100, etx_radio_pid); transceiver_register(TRANSCEIVER_CC1100, etx_radio_pid);
printf("...[DONE]\n"); printf("...[DONE]\n");
} }
void etx_beacon2(void) {
//TODO delete or delete beacon, whatever do use 1 method and del the other
etx_probe_t *etx_p = get_etx_send_buf();
ieee_802154_long_t empty_addr = { 0 };
uint8_t jittercorrection = 10;
uint8_t jitter = (uint8_t) (rand() % 21);
uint8_t p_length = 0;
while (true) {
if (rounds == ETX_ROUNDS) {
//calculate the ETX values and update the parents
thread_wakeup(etx_update_pid);
rounds = 1;
} else {
rounds++;
}
vtimer_usleep(80 * MS + jittercorrection * MS + jitter * MS);
/// TODO once vtimer works as intended, replace the hwtimer here with
/// the vtimer. Right now vtimer bugs, so we have hwtimer here.
//hwtimer_wait(HWTIMER_TICKS(80*MS + jittercorrection*MS + jitter*MS));
jittercorrection = 20 - jitter;
//the jitter is a value between 0 and 20
jitter = (uint8_t) (rand() % 21);
printf("jitter: %d", jitter);
puts("beacon2 run through complete");
show_candidates();
}
}
void etx_beacon(void) { void etx_beacon(void) {
/* /*
* TODO use ETX_INTERVAL variable instead of fixed value * TODO use ETX_INTERVAL variable instead of fixed value
@ -217,17 +174,16 @@ void etx_beacon(void) {
send_ieee802154_frame(&empty_addr, &etx_send_buf[0], send_ieee802154_frame(&empty_addr, &etx_send_buf[0],
get_etx_send_buf()->length + 2, 1); get_etx_send_buf()->length + 2, 1);
puts("sent beacon!"); puts("sent beacon!");
//hwtimer buggt noch mehr als der vtimer... //vtimer_usleep(80 * MS + jittercorrection * MS + jitter * MS);
vtimer_usleep(80 * MS + jittercorrection * MS + jitter * MS);
/// TODO once vtimer works as intended, replace the hwtimer here with /// TODO once vtimer works as intended, replace the hwtimer here with
/// the vtimer. Right now vtimer bugs, so we have hwtimer here. /// the vtimer. Right now vtimer bugs, so we have hwtimer here.
//hwtimer_wait(HWTIMER_TICKS(80*MS + jittercorrection*MS + jitter*MS)); /// hangs after 38 runthroughs (roughly 1 minute, a bit more)
hwtimer_wait(HWTIMER_TICKS(80*MS + jittercorrection*MS + jitter*MS));
jittercorrection = 20 - jitter; jittercorrection = 20 - jitter;
//the jitter is a value between 0 and 20 //the jitter is a value between 0 and 20
jitter = (uint8_t) (rand() % 21); jitter = (uint8_t) (rand() % 21);
printf("jitter: %d", jitter);
} }
} }
@ -261,7 +217,7 @@ void etx_handle_beacon(ipv6_addr_t * candidate_address) {
etx_probe_t * probe = get_etx_rec_buf(); etx_probe_t * probe = get_etx_rec_buf();
//Todo delete once everything works well //Todo delete once everything works well
printf("ETX beacon package received with following values:\n" printf("ETX beacon package received with following values:\n"
"\tPackage Option:%x\n" "\tPackage Option:%x\n"
"\t Data Length:%u\n" "\t Data Length:%u\n"
@ -297,11 +253,11 @@ void etx_radio(void) {
msg_init_queue(msg_que, ETX_RCV_BUFFER_SIZE); msg_init_queue(msg_que, ETX_RCV_BUFFER_SIZE);
// ipv6_addr_t ll_address; ipv6_addr_t ll_address;
// ipv6_addr_t candidate_addr; ipv6_addr_t candidate_addr;
// ipv6_set_ll_prefix(&ll_address); ipv6_set_ll_prefix(&ll_address);
// ipv6_get_saddr(&candidate_addr, &ll_address); ipv6_get_saddr(&candidate_addr, &ll_address);
while (1) { while (1) {
puts("radio"); //TODO del puts("radio"); //TODO del
@ -319,10 +275,9 @@ void etx_radio(void) {
//create IPv6 address from radio packet //create IPv6 address from radio packet
//we can do the cast here since rpl nodes can only have addr //we can do the cast here since rpl nodes can only have addr
//up to 8 bits //up to 8 bits
// candidate_addr.uint8[15] = (uint8_t) p->src; candidate_addr.uint8[15] = (uint8_t) p->src;
//handle the beacon //handle the beacon
// etx_handle_beacon(&candidate_addr); etx_handle_beacon(&candidate_addr);
etx_handle_beacon(0);
} }
p->processing--; p->processing--;
@ -347,7 +302,7 @@ void etx_update(void) {
* *
*/ */
rpl_candidate_neighbor_t * candidate; rpl_candidate_neighbor_t * candidate;
rpl_candidate_neighbor_t *end; rpl_candidate_neighbor_t * end;
while (true) { while (true) {
//good night //good night