Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Zinc at Rust London '14

Zinc at Rust London '14

Vladimir Pouzanov

August 14, 2014
Tweet

More Decks by Vladimir Pouzanov

Other Decks in Technology

Transcript

  1. fun

  2. pub  unsafe  fn  main()  {      init_stack();    

     init_data();      system_clock::init_clock(&Clock  {          source:  system_clock::Main(12000000),            pll:  Some(PLL0  {              m:  50,                n:  3,                divisor:  4          })      });      let  timer  =  Timer::new(Timer1,  25,  4);      let  led1  =  Pin::new(Port1,  18,  GPIO,  Some(Out));      let  led2  =  Pin::new(Port1,  20,  GPIO,  Some(Out));      loop  {          run(&pt::run_args  {              led1:  &led1,              led2:  &led2,              timer:  &timer          });      }   }
  3. pub  unsafe  fn  main()  {      init_stack();    

     init_data();      system_clock::init_clock(&Clock  {          source:  system_clock::Main(12000000),            pll:  Some(PLL0  {              m:  50,                n:  3,                divisor:  4          })      });      let  timer  =  Timer::new(Timer1,  25,  4);      let  led1  =  Pin::new(Port1,  18,  GPIO,  Some(Out));      let  led2  =  Pin::new(Port1,  20,  GPIO,  Some(Out));      loop  {          run(&pt::run_args  {              led1:  &led1,              led2:  &led2,              timer:  &timer          });      }   }
  4. pub  unsafe  fn  main()  {      init_stack();    

     init_data();      system_clock::init_clock(&Clock  {          source:  system_clock::Main(12000000),            pll:  Some(PLL0  {              m:  50,                n:  3,                divisor:  4          })      });      let  timer  =  Timer::new(Timer1,  25,  4);      let  led1  =  Pin::new(Port1,  18,  GPIO,  Some(Out));      let  led2  =  Pin::new(Port1,  20,  GPIO,  Some(Out));      loop  {          run(&pt::run_args  {              led1:  &led1,              led2:  &led2,              timer:  &timer          });      }   }
  5. pub  unsafe  fn  main()  {      init_stack();    

     init_data();      system_clock::init_clock(&Clock  {          source:  system_clock::Main(12000000),            pll:  Some(PLL0  {              m:  50,                n:  3,                divisor:  4          })      });      let  timer  =  Timer::new(Timer1,  25,  4);      let  led1  =  Pin::new(Port1,  18,  GPIO,  Some(Out));      let  led2  =  Pin::new(Port1,  20,  GPIO,  Some(Out));      loop  {          run(&pt::run_args  {              led1:  &led1,              led2:  &led2,              timer:  &timer          });      }   }
  6. pub  unsafe  fn  main()  {      init_stack();    

     init_data();      system_clock::init_clock(&Clock  {          source:  system_clock::Main(12000000),            pll:  Some(PLL0  {              m:  50,                n:  3,                divisor:  4          })      });      let  timer  =  Timer::new(Timer1,  25,  4);      let  led1  =  Pin::new(Port1,  18,  GPIO,  Some(Out));      let  led2  =  Pin::new(Port1,  20,  GPIO,  Some(Out));      loop  {          run(&pt::run_args  {              led1:  &led1,              led2:  &led2,              timer:  &timer          });      }   }
  7. pub  unsafe  fn  main()  {      init_stack();    

     init_data();      system_clock::init_clock(&Clock  {          source:  system_clock::Main(12000000),            pll:  Some(PLL0  {              m:  50,                n:  3,                divisor:  4          })      });      let  timer  =  Timer::new(Timer1,  25,  4);      let  led1  =  Pin::new(Port1,  18,  GPIO,  Some(Out));      let  led2  =  Pin::new(Port1,  20,  GPIO,  Some(Out));      loop  {          run(&pt::run_args  {              led1:  &led1,              led2:  &led2,              timer:  &timer          });      }   }
  8. pub  unsafe  fn  main()  {      init_stack();    

     init_data();      system_clock::init_clock(&Clock  {          source:  system_clock::Main(12000000),            pll:  Some(PLL0  {              m:  50,                n:  3,                divisor:  4          })      });      let  timer  =  Timer::new(Timer1,  25,  4);      let  led1  =  Pin::new(Port1,  18,  GPIO,  Some(Out));      let  led2  =  Pin::new(Port1,  20,  GPIO,  Some(Out));      loop  {          run(&pt::run_args  {              led1:  &led1,              led2:  &led2,              timer:  &timer          });      }   }
  9. pub  unsafe  fn  main()  {      init_stack();    

     init_data();      system_clock::init_clock(&Clock  {          source:  system_clock::Main(12000000),            pll:  Some(PLL0  {              m:  50,                n:  3,                divisor:  4          })      });      let  timer  =  Timer::new(Timer1,  25,  4);      let  led1  =  Pin::new(Port1,  18,  GPIO,  Some(Out));      let  led2  =  Pin::new(Port1,  20,  GPIO,  Some(Out));      loop  {          run(&pt::run_args  {              led1:  &led1,              led2:  &led2,              timer:  &timer          });      }   }
  10. fn  run(args:  &pt::run_args)  {      args.led1.set_high();      args.led2.set_low();

         args.timer.wait(1);   !    args.led1.set_low();      args.led2.set_high();      args.timer.wait(1);   }  
  11. fn  run(args:  &pt::run_args)  {      args.led1.set_high();      args.led2.set_low();

         args.timer.wait(1);   !    args.led1.set_low();      args.led2.set_high();      args.timer.wait(1);   }   WHAT IF I SAY THIS IS THE ONLY CODE YOU NEED?
  12.    lpc17xx@mcu  {          clock  {  

               source  =  "main-­‐oscillator";              source_frequency  =  12_000_000;              pll  {  m  =  50;  n  =  3;  divisor  =  4;  }          }   !        timer  {              timer@1  {  counter  =  25;  divisor  =  4;  }          }   !        gpio  {              1  {                  led1@18  {  direction  =  "out";  }                  led2@20  {  direction  =  "out";  }              }          }      }   !    os  {          single_task  {              loop  =  "run";              args  {  timer  =  &timer;  led1  =  &led1;  led2  =  &led2;  }          }      }
  13.    lpc17xx@mcu  {          clock  {  

               source  =  "main-­‐oscillator";              source_frequency  =  12_000_000;              pll  {  m  =  50;  n  =  3;  divisor  =  4;  }          }   !        timer  {              timer@1  {  counter  =  25;  divisor  =  4;  }          }   !        gpio  {              1  {                  led1@18  {  direction  =  "out";  }                  led2@20  {  direction  =  "out";  }              }          }      }   !    os  {          single_task  {              loop  =  "run";              args  {  timer  =  &timer;  led1  =  &led1;  led2  =  &led2;  }          }      }
  14.    lpc17xx@mcu  {          clock  {  

               source  =  "main-­‐oscillator";              source_frequency  =  12_000_000;              pll  {  m  =  50;  n  =  3;  divisor  =  4;  }          }   !        timer  {              timer@1  {  counter  =  25;  divisor  =  4;  }          }   !        gpio  {              1  {                  led1@18  {  direction  =  "out";  }                  led2@20  {  direction  =  "out";  }              }          }      }   !    os  {          single_task  {              loop  =  "run";              args  {  timer  =  &timer;  led1  =  &led1;  led2  =  &led2;  }          }      }
  15.    lpc17xx@mcu  {          clock  {  

               source  =  "main-­‐oscillator";              source_frequency  =  12_000_000;              pll  {  m  =  50;  n  =  3;  divisor  =  4;  }          }   !        timer  {              timer@1  {  counter  =  25;  divisor  =  4;  }          }   !        gpio  {              1  {                  led1@18  {  direction  =  "out";  }                  led2@20  {  direction  =  "out";  }              }          }      }   !    os  {          single_task  {              loop  =  "run";              args  {  timer  =  &timer;  led1  =  &led1;  led2  =  &led2;  }          }      }
  16.    lpc17xx@mcu  {          clock  {  

               source  =  "main-­‐oscillator";              source_frequency  =  12_000_000;              pll  {  m  =  50;  n  =  3;  divisor  =  4;  }          }   !        timer  {              timer@1  {  counter  =  25;  divisor  =  4;  }          }   !        gpio  {              1  {                  led1@18  {  direction  =  "out";  }                  led2@20  {  direction  =  "out";  }              }          }      }   !    os  {          single_task  {              loop  =  "run";              args  {  timer  =  &timer;  led1  =  &led1;  led2  =  &led2;  }          }      }
  17.    lpc17xx@mcu  {          clock  {  

               source  =  "main-­‐oscillator";              source_frequency  =  12_000_000;              pll  {  m  =  50;  n  =  3;  divisor  =  4;  }          }   !        timer  {              timer@1  {  counter  =  25;  divisor  =  4;  }          }   !        gpio  {              1  {                  led1@18  {  direction  =  "out";  }                  led2@20  {  direction  =  "out";  }              }          }      }   !    os  {          single_task  {              loop  =  "run";              args  {  timer  =  &timer;  led1  =  &led1;  led2  =  &led2;  }          }      }
  18. single_task  {      loop  =  "run";      

       args  {              timer  =  &timer;              uart  =  &uart;              dht  =  &dht;          }      }   }   ! pub  struct  run_args<'a,  P,  Q>  {          pub  dht:  &'a  zinc::drivers::dht22::DHT22<'a,  P,  Q>,          pub  timer:  &'a  zinc::hal::lpc17xx::timer::Timer,          pub  uart:  &'a  zinc::hal::lpc17xx::uart::UART,   }
  19. fn  run<P:  zinc::hal::timer::Timer,              

     Q:  zinc::hal::pin::GPIO>(args:  &pt::run_args<P,  Q>)  {        ...   }