Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • pmrust/pmrust.pages.upb.ro
  • genan.omer/pmrust.pages.upb.ro
  • vladut.chintoiu/pmrust.pages.upb.ro
  • petru.nania/website-pmrust-fork
  • sofia.huzan/pmrust.pages.upb.ro
  • ionut.pruteanu2308/arcade-game
  • luana.militaru/pong-game
  • sebastian.scrob/project
  • matei.bejinaru/website-bejinaru-matei
  • adragomir2806/website-dragomir-alexandru
  • fatemehsadat/pmrust.pages.upb.ro
  • razvan.costea2205/pmrust.pages.upb.ro
  • darius_gabriel.iuga/pm-website
  • andrei.neagu1910/pmrust.pages.upb.ro
  • irina.chiorean/pmrust.pages.upb.ro
  • adrian_costin.lungu/pmrust.pages.upb.ro
16 results
Show changes
Commits on Source (26)
Showing
with 272 additions and 194 deletions
......@@ -11,7 +11,7 @@ drawings:
defaults:
foo: true
transition: slide-left
title: MA - 05 - Asynchronous Development
title: MA - 04 - Asynchronous Development
mdc: true
layout: cover
themeConfig:
......@@ -22,7 +22,7 @@ background:
---
# Asynchronous Development
Lecture 5
Lecture 4
---
---
......
......@@ -11,7 +11,7 @@ drawings:
defaults:
foo: true
transition: slide-left
title: MA - 03 - UART & SPI
title: MA - 05 - UART & SPI
mdc: true
layout: cover
themeConfig:
......@@ -22,7 +22,7 @@ background:
---
# UART & SPI
Lecture 6
Lecture 5
---
......
......@@ -11,7 +11,7 @@ drawings:
defaults:
foo: true
transition: slide-left
title: MA - 07 - I2C & USB 2.0
title: MA - 06 - I2C & USB 2.0
mdc: true
layout: cover
themeConfig:
......@@ -22,7 +22,7 @@ background:
---
# I2C & USB 2.0
Lecture 7
Lecture 6
---
......
......@@ -11,7 +11,7 @@ drawings:
defaults:
foo: true
transition: slide-left
title: MA - 03 - Exceptions and Interrupts
title: MA - 07 - Exceptions and Interrupts
mdc: true
layout: cover
themeConfig:
......@@ -22,7 +22,7 @@ background:
---
# Exceptions and Interrupts
Lecture 3
Lecture 7
---
......
......@@ -119,8 +119,8 @@ Embassy provides four types of channels synchronized using `Mutex`s
|-|-|
| [`Channel`](https://docs.embassy.dev/embassy-sync/git/default/channel/struct.Channel.html) | A Multiple Producer Multiple Consumer (MPMC) channel. Each message is only received by a single consumer. |
| [`PriorityChannel`](https://docs.embassy.dev/embassy-sync/git/default/priority_channel/struct.PriorityChannel.html) | A Multiple Producer Multiple Consumer (MPMC) channel. Each message is only received by a single consumer. Higher priority items are shifted to the front of the channel. |
| [`Signal`](https://docs.embassy.dev/embassy-sync/git/default/pubsub/struct.PubSubChannel.html) | Signalling latest value to a single consumer. |
| [`PubSubChannel`](https://docs.embassy.dev/embassy-sync/git/default/signal/struct.Signal.html) | A broadcast channel (publish-subscribe) channel. Each message is received by all consumers. |
| [`Signal`](https://docs.embassy.dev/embassy-sync/git/default/signal/struct.Signal.html) | Signalling latest value to a single consumer. |
| [`PubSubChannel`](https://docs.embassy.dev/embassy-sync/git/default/pubsub/struct.PubSubChannel.html) | A broadcast channel (publish-subscribe) channel. Each message is received by all consumers. |
---
---
......@@ -129,7 +129,7 @@ sends data from one task to another
[`Channel`](https://docs.embassy.dev/embassy-sync/git/default/channel/struct.Channel.html) - A Multiple Producer Multiple Consumer (MPMC) channel. Each message is only received by a single consumer.
[`Signal`](https://docs.embassy.dev/embassy-sync/git/default/pubsub/struct.PubSubChannel.html) - Signalling latest value to a single consumer.
[`Signal`](https://docs.embassy.dev/embassy-sync/git/default/signal/struct.Signal.html) - Signalling latest value to a single consumer.
```mermaid
flowchart LR
......@@ -166,7 +166,7 @@ flowchart LR
# PubSubChannel
sends data from one task to all receiver tasks
[`PubSubChannel`](https://docs.embassy.dev/embassy-sync/git/default/signal/struct.Signal.html) - A broadcast channel (publish-subscribe) channel. Each message is received by all consumers.
[`PubSubChannel`](https://docs.embassy.dev/embassy-sync/git/default/pubsub/struct.PubSubChannel.html) - A broadcast channel (publish-subscribe) channel. Each message is received by all consumers.
```mermaid
flowchart LR
......@@ -181,7 +181,7 @@ flowchart LR
# Channel Example
```rust{all|1|2|5,7,14,17-25|5,8-14}
```rust{1|2|5,7,14,17-25|5,8-14|all}
enum LedState { On, Off }
static CHANNEL: Channel<ThreadModeRawMutex, LedState, 64> = Channel::new();
......
......@@ -22,7 +22,7 @@ layout: two-cols
}
</style>
- MCUs are usually *single core*[^rp2040]
- MCUs are usually *single core*[^rp2350]
- Tasks in parallel require an OS[^interrupts]
- Tasks can be suspended at any time
- **Switching** the task is **expensive**
......@@ -54,7 +54,7 @@ sequenceDiagram
end
```
[^rp2040]: RP2040 is a dual core MCU, we use only one core
[^rp2350]: RP2350 is a dual core MCU, we use only one core
[^interrupts]: Running in an ISR is not considered a normal task
---
......
......@@ -9,10 +9,10 @@ of Embassy
# Bibliography
for this section
**Embassy Documentation**, *[Embassy executor](https://embassy.dev/book/dev/runtime.html)*
**Embassy Documentation**, *[Embassy executor](https://embassy.dev/book/#_embassy_executor)*
---
---
# Tasks
<div grid="~ cols-2 gap5">
......@@ -32,9 +32,9 @@ for this section
</div>
```rust {all|9-22|1-7|18-21|19|3-6|4|5}
```rust {9-22|1-7|18-21|19|3-6|4|5|all}
#[embassy_executor::task(pool_size = 2)]
async fn led_blink(mut led:Output<'static, PIN_X>) {
async fn led_blink(mut led: AnyPin) {
loop {
led.toogle();
Timer::after_secs(1).await;
......@@ -60,7 +60,7 @@ async fn main(spawner: Spawner) {
</div>
---
---
# Tasks can stop the executor
<div grid="~ cols-2 gap5">
......@@ -73,9 +73,9 @@ async fn main(spawner: Spawner) {
</div>
``` {all|5-8|3-9}
```rust {5-8|3-9|all}
#[embassy_executor::task]
async fn led_blink(mut led:Output<'static, PIN_X>) {
async fn led_blink(mut led: AnyPin) {
loop {
led.toogle();
// this does not execute anything
......@@ -114,6 +114,7 @@ async fn main(spawner: Spawner) {
---
layout: two-cols
---
## Priority Tasks
<style>
......@@ -139,7 +140,7 @@ unsafe fn SWI_IRQ_0() {
:: right ::
```rust {all|5,6,22|1,7-10|2,12-15|3,17-21}
```rust {5,6,22|1,7-10|2,12-15|3,17-21|all}
static EXECUTOR_HIGH: InterruptExecutor = InterruptExecutor::new();
static EXECUTOR_MED: InterruptExecutor = InterruptExecutor::new();
static EXECUTOR_LOW: StaticCell<Executor> = StaticCell::new();
......
......@@ -33,7 +33,7 @@ trait Future {
}
```
```rust {all|5,10|6|6,7|6|6,7|6|6,8|1,8}{lines: false}
```rust {5,10|6|6,7|6|6,7|6|6,8|1,8|all}{lines: false}
fn execute<F>(mut f: F) -> F::Output
where
F: Future
......@@ -74,7 +74,7 @@ sequenceDiagram
<div grid="~ cols-2 gap-5">
```rust {all|1-4|6-9|11-18}
```rust {1-4|6-9|11-18|all}
enum SleepStatus {
SetAlarm,
WaitForAlarm,
......@@ -97,7 +97,7 @@ impl Sleep {
<v-click>
```rust {all|1,20|1,2,20|4,19|5,18|6-10|11-17|11,12,13|11,14,15}{lines: false}
```rust {1,20|1,2,20|4,19|5,18|6-10|11-17|11,12,13|11,14,15|all}{lines: false}
impl Future for Sleep {
type Output = ();
......@@ -130,7 +130,7 @@ impl Future for Sleep {
<div grid="~ cols-2 gap-5">
```rust {all|1,20|1,2,20|4,19|5,18|6-10|11-17|11,12,13|11,14,15}{lines: false}
```rust {1,20|1,2,20|4,19|5,18|6-10|11-17|11,12,13|11,14,15|all}{lines: false}
impl Future for Sleep {
type Output = ();
......@@ -218,7 +218,7 @@ fn blink(led: Output<'static, PIN_X>) -> Blink {
<v-click>
```rust {4-23|5-22|5,6-10,22|5,11-17,22|12-14|5,11-17,22|12,14,15,16|5,18-21,22}{lines: false}
```rust {4-23|5-22|5,6-10,22|5,11-17,22|12-14|5,11-17,22|12,14,15,16|5,18-21,22|all}{lines: false}
impl Future for Blink {
type Output = ();
fn poll(&mut self) -> Poll<Self::Output> {
......@@ -257,7 +257,7 @@ impl Future for Blink {
- it does not know how to execute them
- executors are implemented into third party libraries
```rust {all|12|11,13,15|14}
```rust {12|11,13,15|14|all}
use engine::execute;
// Rust rewrites the function to a Future
......@@ -280,7 +280,7 @@ fn main() -> ! {
---
# Executor
```rust {all|1|4-16|5-12|14,15}
```rust {1|4-16|5-12|14,15|all}
static TASKS: [Option<impl Future>; N] = [None, N];
fn executor() {
......
......@@ -84,11 +84,12 @@ This is how a Rust application would look like
<div grid="~ cols-2 gap-4">
```rust{all|1|2|4|6|7,11|10|13-16}
```rust{all|1|2|4,5|7|8,12|11|14-17}
#![no_std]
#![no_main]
use cortex_m_rt::entry;
use core::panic::PanicInfo;
#[entry]
fn main() -> ! {
......@@ -126,6 +127,7 @@ This is how a Rust application would look like
use core::ptr::{read_volatile, write_volatile};
use cortex_m_rt::entry;
use core::panic::PanicInfo;
const GPIOX_CTRL: u32 = 0x4001_4004;
const GPIO_OE_SET: *mut u32= 0xd000_0024 as *mut u32;
......@@ -134,25 +136,25 @@ const GPIO_OUT_CLR:*mut u32= 0xd000_0018 as *mut u32;
#[panic_handler]
pub fn panic(_info: &PanicInfo) -> ! {
loop { }
loop { }
}
```
```rust {all}{startLine:18}
#[entry]
fn main() -> ! {
let gpio_ctrl = GPIOX_CTRL + 8 * pin as *mut u32;
unsafe {
write_volatile(gpio_ctrl, 5);
write_volatile(GPIO_OE_SET, 1 << pin);
let reg = match value {
0 => GPIO_OUT_CLR,
_ => GPIO_OUT_SET
};
write_volatile(reg, 1 << pin);
};
loop { }
let gpio_ctrl = (GPIOX_CTRL + 8 * pin) as *mut u32;
unsafe {
write_volatile(gpio_ctrl, 5);
write_volatile(GPIO_OE_SET, 1 << pin);
let reg = match value {
0 => GPIO_OUT_CLR,
_ => GPIO_OUT_SET
};
write_volatile(reg, 1 << pin);
};
loop { }
}
```
......
......@@ -212,7 +212,7 @@ read the number of elapsed μs since reset
#### Reading the time elapsed since restart
```rust{1,5|2,6|4,7,8|all}
```rust {1,5|2,6|4,7,8|all}
const TIMERLR: *const u32 = 0x400b_000c;
const TIMERHR: *const u32 = 0x400b_0008;
......@@ -228,7 +228,7 @@ The **reading order maters** as reading `TIMELR` latches the value in `TIMEHR` (
:: right ::
<div align="center">
<img src="./rp2350_timer_registers_1.png" class="rounded w-100">
<img src="./rp2350_timer_registers_1.png" class="rounded w-90">
</div>
---
......
......@@ -72,7 +72,7 @@ fn main() {
let age = 26;
println!("Hello, {}. You are {} years old", name, age);
// if the replacements are only variable, one can use the inline version
// if the replacements are only variables, one can use the inline version
println!("Hello, {name}. You are {age} years old");
}
```
......@@ -155,7 +155,7 @@ let y: u16 = 25;
| 32-bit | `i32` | `u32` | `int` / `Integer`[^java_unsigned] | `int` / `unsigned int` |
| 64-bit | `i64` | `u64` | `long` / `Long`[^java_unsigned] | `long long` / `unsigned long long` |
| 128-bit | `i128` | `u128` | N/A | N/A |
| arch | `isize` | `usize` | N/A | `int` / `unsigned int` |
| arch | `isize` | `usize` | N/A | `intptr_t` / `uintptr_t` |
**Floating Point** → Rust's floating point types are `f32` and `f64`, which are 32-bit and 64-bit in size, respectively. The default type is `f64` because on modern CPUs it is about the same speed as `f32` but is capable of more precision. All floating point types are **signed**.
......@@ -341,7 +341,7 @@ To format the `Debug` nicely use `{:#?}`.
### Tuple structures
Tuples are the same construct as structures, just that instead of using names for their field, they use numbers (indexes).
Tuples are the same as structures, just that instead of using names for their fields, they use numbers (indexes).
```rust
struct Color(i32, i32, i32);
......
......@@ -287,6 +287,7 @@ pin.set_high();
pin.set_low();
```
:::tip
While the device initialization is specific to every hardware device (the example uses the
......@@ -407,9 +408,15 @@ as they are connected to the lab board's debugger chip.
The board provides four single colored LEDs, red, green, blue and yellow. Each one of them
uses one pin for control. Each LED connector has one single hole on the board,
marked with `RED`, `GREEN', `BLUE` and `YELLOW` respectively. These are located in the **Connectors**
marked with `RED`, `GREEN`, `BLUE` and `YELLOW` respectively. These are located in the **Connectors**
section of the board.
:::warning
The LEDs are connected so they will light up if the pin is set to `Level::Low` and turn off if the pin is set to `Level::High`.
:::
The four switches that the lab board provides are signaled with labels
`SW4`, `SW5`, `SW6` and `SW7` in the connectors section.
......
website/lab/03/images/board_photoresistor.png

246 KiB

website/lab/03/images/board_rgb.png

433 KiB

website/lab/03/images/board_servo.png

942 KiB

website/lab/03/images/common_anode_common_cathode.png

90.6 KiB | W: 0px | H: 0px

website/lab/03/images/common_anode_common_cathode.png

227 KiB | W: 0px | H: 0px

website/lab/03/images/common_anode_common_cathode.png
website/lab/03/images/common_anode_common_cathode.png
website/lab/03/images/common_anode_common_cathode.png
website/lab/03/images/common_anode_common_cathode.png
  • 2-up
  • Swipe
  • Onion skin
website/lab/03/images/pwm_rp2040_pins.png

98 KiB | W: 0px | H: 0px

website/lab/03/images/pwm_rp2040_pins.png

51.7 KiB | W: 0px | H: 0px

website/lab/03/images/pwm_rp2040_pins.png
website/lab/03/images/pwm_rp2040_pins.png
website/lab/03/images/pwm_rp2040_pins.png
website/lab/03/images/pwm_rp2040_pins.png
  • 2-up
  • Swipe
  • Onion skin
website/lab/03/images/servo_motor.png

191 KiB

website/lab/03/images/servo_wires.png

176 KiB