Zinc at Rust London '14

Zinc at Rust London '14

Abc432bb0450574a25b15ff23d399d5a?s=128

Vladimir Pouzanov

August 14, 2014
Tweet

Transcript

  1. Zn 30 65.38 Vladimir Pouzanov <farcaller@gmail.com>

  2. rust

  3. embedded

  4. None
  5. None
  6. zinc

  7. why rust?

  8. fun

  9. embedded

  10. it's C and C++ all the way down

  11. useful features

  12. safe

  13. expressive

  14. still not 1.0

  15. metaprogramming

  16. a typical embedded program

  17. think arduino "hello world" in rust

  18. 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          });      }   }
  19. 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          });      }   }
  20. 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          });      }   }
  21. 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          });      }   }
  22. 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          });      }   }
  23. 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          });      }   }
  24. 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          });      }   }
  25. 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          });      }   }
  26. 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);   }  
  27. 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?
  28. platform definition and verification in code

  29.    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;  }          }      }
  30.    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;  }          }      }
  31.    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;  }          }      }
  32.    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;  }          }      }
  33.    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;  }          }      }
  34.    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;  }          }      }
  35. compile-time validation

  36. example: configure SPI pin

  37. None
  38. Pin::new(Port1,  11,  Function3,  Some(Out)); X

  39. spi_ck@11  {  function  =  "sck";  }

  40. spi_ck@11  {  function  =  "sck";  }

  41. hiding complexity from user

  42. 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,   }
  43. #[zinc_task]   fn  run(args:  &pt::run_args)  {        

     ...   }
  44. #[zinc_task]   fn  run(args:  &pt::run_args)  {        

     ...   }
  45. fn  run<P:  zinc::hal::timer::Timer,              

     Q:  zinc::hal::pin::GPIO>(args:  &pt::run_args<P,  Q>)  {        ...   }
  46. thanks! questions? http://vfp.in/zinc-london