Skip to content

Commit 020acab

Browse files
authored
Automatically size tasks (#595)
This PR implements task autosizing, at long last! It builds on the previous work with relocatable task builds (#584). After building the relocatable task ELF file, it runs a "dummy link" against a linker script with "infinite" memory (in practice, the entirety of memory available on the chip). It then parses the resulting (static) binary to extract sizes. After finding sizes for every task, it runs the same memory packer as before, then relinks each task with the resulting memory. Task sizes are based on the target microcontroller, with a new `alignment` parameter passed to `allocate_one`. There are extensive changes to `cargo xtask sizes` to make it more generically useful, decoupling the suggestions from the "find the size of a static ELF". WARNING: this changes the format of the exported JSON files! In addition, there are a bunch of new helper functions in `Config` to help with task and memory sizing / alignment. This fixes #474 and maybe #439, and deprecates #476
1 parent b210eae commit 020acab

File tree

34 files changed

+917
-541
lines changed

34 files changed

+917
-541
lines changed

app/demo-stm32f4-discovery/app-f3.toml

+8-8
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ execute = true
3535
[tasks.jefe]
3636
name = "task-jefe"
3737
priority = 0
38-
requires = {flash = 8192, ram = 2048}
38+
max-sizes = {flash = 8192, ram = 2048}
3939
start = true
4040
features = ["itm"]
4141
stacksize = 1536
@@ -44,15 +44,15 @@ stacksize = 1536
4444
name = "drv-stm32fx-rcc"
4545
features = ["f3"]
4646
priority = 1
47-
requires = {flash = 4096, ram = 1024}
47+
max-sizes = {flash = 4096, ram = 1024}
4848
uses = ["rcc"]
4949
start = true
5050

5151
[tasks.usart_driver]
5252
name = "drv-stm32fx-usart"
5353
features = ["stm32f3"]
5454
priority = 2
55-
requires = {flash = 8192, ram = 1024}
55+
max-sizes = {flash = 8192, ram = 1024}
5656
uses = ["usart2", "gpioa"]
5757
start = true
5858
interrupts = {"usart2.irq" = 1}
@@ -62,7 +62,7 @@ task-slots = ["rcc_driver"]
6262
name = "drv-user-leds"
6363
features = ["stm32f3"]
6464
priority = 2
65-
requires = {flash = 8192, ram = 1024}
65+
max-sizes = {flash = 8192, ram = 1024}
6666
uses = ["gpioe"]
6767
start = true
6868
task-slots = ["rcc_driver"]
@@ -71,29 +71,29 @@ task-slots = ["rcc_driver"]
7171
name = "task-ping"
7272
features = ["uart"]
7373
priority = 4
74-
requires = {flash = 8192, ram = 1024}
74+
max-sizes = {flash = 8192, ram = 1024}
7575
stacksize = 512
7676
start = true
7777
task-slots = [{peer = "pong"}, "usart_driver"]
7878

7979
[tasks.pong]
8080
name = "task-pong"
8181
priority = 3
82-
requires = {flash = 8192, ram = 1024}
82+
max-sizes = {flash = 8192, ram = 1024}
8383
start = true
8484
task-slots = ["user_leds"]
8585

8686
[tasks.hiffy]
8787
name = "task-hiffy"
8888
priority = 3
89-
requires = {flash = 16384, ram = 16384 }
89+
max-sizes = {flash = 16384, ram = 16384 }
9090
stacksize = 2048
9191
start = true
9292

9393
[tasks.idle]
9494
name = "task-idle"
9595
priority = 5
96-
requires = {flash = 128, ram = 256}
96+
max-sizes = {flash = 128, ram = 256}
9797
stacksize = 256
9898
start = true
9999

app/demo-stm32f4-discovery/app.toml

+8-8
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ execute = true
3535
[tasks.jefe]
3636
name = "task-jefe"
3737
priority = 0
38-
requires = {flash = 8192, ram = 2048}
38+
max-sizes = {flash = 8192, ram = 2048}
3939
start = true
4040
features = ["itm"]
4141
stacksize = 1536
@@ -44,15 +44,15 @@ stacksize = 1536
4444
name = "drv-stm32fx-rcc"
4545
features = ["f4"]
4646
priority = 1
47-
requires = {flash = 4096, ram = 1024}
47+
max-sizes = {flash = 4096, ram = 1024}
4848
uses = ["rcc"]
4949
start = true
5050

5151
[tasks.usart_driver]
5252
name = "drv-stm32fx-usart"
5353
features = ["stm32f4"]
5454
priority = 2
55-
requires = {flash = 8192, ram = 1024}
55+
max-sizes = {flash = 8192, ram = 1024}
5656
uses = ["usart2", "gpioa"]
5757
start = true
5858
interrupts = {"usart2.irq" = 1}
@@ -62,7 +62,7 @@ task-slots = ["rcc_driver"]
6262
name = "drv-user-leds"
6363
features = ["stm32f4"]
6464
priority = 2
65-
requires = {flash = 8192, ram = 1024}
65+
max-sizes = {flash = 8192, ram = 1024}
6666
uses = ["gpiod"]
6767
start = true
6868
task-slots = ["rcc_driver"]
@@ -71,28 +71,28 @@ task-slots = ["rcc_driver"]
7171
name = "task-ping"
7272
features = ["uart"]
7373
priority = 4
74-
requires = {flash = 8192, ram = 1024}
74+
max-sizes = {flash = 8192, ram = 1024}
7575
stacksize = 512
7676
start = true
7777
task-slots = [{peer = "pong"}, "usart_driver"]
7878

7979
[tasks.pong]
8080
name = "task-pong"
8181
priority = 3
82-
requires = {flash = 8192, ram = 1024}
82+
max-sizes = {flash = 8192, ram = 1024}
8383
start = true
8484
task-slots = ["user_leds"]
8585

8686
[tasks.hiffy]
8787
name = "task-hiffy"
8888
priority = 3
89-
requires = {flash = 16384, ram = 16384 }
89+
max-sizes = {flash = 16384, ram = 16384 }
9090
stacksize = 2048
9191
start = true
9292

9393
[tasks.idle]
9494
name = "task-idle"
9595
priority = 5
96-
requires = {flash = 128, ram = 256}
96+
max-sizes = {flash = 128, ram = 256}
9797
stacksize = 256
9898
start = true

app/demo-stm32g0-nucleo/app-g031.toml

+6-6
Original file line numberDiff line numberDiff line change
@@ -25,15 +25,15 @@ execute = false # let's assume XN until proven otherwise
2525
[tasks.jefe]
2626
name = "task-jefe"
2727
priority = 0
28-
requires = {flash = 4096, ram = 512}
28+
max-sizes = {flash = 4096, ram = 512}
2929
start = true
3030
features = ["log-null"]
3131
stacksize = 368
3232

3333
[tasks.sys]
3434
name = "drv-stm32xx-sys"
3535
priority = 1
36-
requires = {flash = 2048, ram = 256}
36+
max-sizes = {flash = 2048, ram = 256}
3737
uses = ["rcc", "gpio"]
3838
start = true
3939
features = ["g031"]
@@ -42,7 +42,7 @@ stacksize = 256
4242
[tasks.pong]
4343
name = "task-pong"
4444
priority = 4
45-
requires = {flash = 1024, ram = 256}
45+
max-sizes = {flash = 1024, ram = 256}
4646
start = true
4747
task-slots = ["user_leds"]
4848
stacksize = 256
@@ -51,15 +51,15 @@ stacksize = 256
5151
name = "drv-user-leds"
5252
features = ["stm32g0"]
5353
priority = 3
54-
requires = {flash = 2048, ram = 256}
54+
max-sizes = {flash = 2048, ram = 256}
5555
start = true
5656
task-slots = ["sys"]
5757
stacksize = 256
5858

5959
[tasks.hiffy]
6060
name = "task-hiffy"
6161
priority = 4
62-
requires = {flash = 8192, ram = 2048}
62+
max-sizes = {flash = 8192, ram = 2048}
6363
start = true
6464
task-slots = ["sys"]
6565
stacksize = 912
@@ -68,6 +68,6 @@ features = ["stm32g0", "gpio", "micro"]
6868
[tasks.idle]
6969
name = "task-idle"
7070
priority = 5
71-
requires = {flash = 128, ram = 64}
71+
max-sizes = {flash = 128, ram = 64}
7272
stacksize = 64
7373
start = true

app/demo-stm32g0-nucleo/app-g070.toml

+8-8
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ execute = false # let's assume XN until proven otherwise
2626
[tasks.jefe]
2727
name = "task-jefe"
2828
priority = 0
29-
requires = {flash = 4096, ram = 512}
29+
max-sizes = {flash = 4096, ram = 512}
3030
start = true
3131
features = ["log-null"]
3232
stacksize = 352
@@ -35,7 +35,7 @@ stacksize = 352
3535
name = "drv-stm32xx-sys"
3636
features = ["g070"]
3737
priority = 1
38-
requires = {flash = 2048, ram = 256}
38+
max-sizes = {flash = 2048, ram = 256}
3939
uses = ["rcc", "gpio"]
4040
start = true
4141
stacksize = 256
@@ -44,7 +44,7 @@ stacksize = 256
4444
name = "drv-stm32g0-usart"
4545
features = ["g070"]
4646
priority = 2
47-
requires = {flash = 4096, ram = 256}
47+
max-sizes = {flash = 4096, ram = 256}
4848
uses = ["usart1"]
4949
start = true
5050
interrupts = {"usart1.irq" = 1}
@@ -55,15 +55,15 @@ stacksize = 256
5555
name = "drv-user-leds"
5656
features = ["stm32g0"]
5757
priority = 2
58-
requires = {flash = 2048, ram = 256}
58+
max-sizes = {flash = 2048, ram = 256}
5959
start = true
6060
task-slots = ["sys"]
6161
stacksize = 256
6262

6363
[tasks.pong]
6464
name = "task-pong"
6565
priority = 3
66-
requires = {flash = 1024, ram = 256}
66+
max-sizes = {flash = 1024, ram = 256}
6767
start = true
6868
task-slots = ["user_leds"]
6969
stacksize = 256
@@ -72,20 +72,20 @@ stacksize = 256
7272
name = "task-ping"
7373
features = ["uart"]
7474
priority = 4
75-
requires = {flash = 8192, ram = 512}
75+
max-sizes = {flash = 8192, ram = 512}
7676
stacksize = 256
7777
start = true
7878
task-slots = [{peer = "pong"}, "usart_driver"]
7979

8080
[tasks.hiffy]
8181
name = "task-hiffy"
8282
priority = 3
83-
requires = {flash = 8192, ram = 8192 }
83+
max-sizes = {flash = 8192, ram = 8192 }
8484
start = true
8585

8686
[tasks.idle]
8787
name = "task-idle"
8888
priority = 5
89-
requires = {flash = 128, ram = 64}
89+
max-sizes = {flash = 128, ram = 64}
9090
stacksize = 64
9191
start = true

app/demo-stm32h7-nucleo/app-h743.toml

+13-13
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ dma = true
4949
[tasks.jefe]
5050
name = "task-jefe"
5151
priority = 0
52-
requires = {flash = 8192, ram = 2048}
52+
max-sizes = {flash = 8192, ram = 2048}
5353
start = true
5454
features = ["itm"]
5555
stacksize = 1536
@@ -61,15 +61,15 @@ on-state-change = {net = {bit-number = 3}}
6161
name = "drv-stm32xx-sys"
6262
features = ["h743"]
6363
priority = 1
64-
requires = {flash = 2048, ram = 1024}
64+
max-sizes = {flash = 2048, ram = 1024}
6565
uses = ["rcc", "gpios1", "gpios2", "gpios3"]
6666
start = true
6767

6868
[tasks.i2c_driver]
6969
name = "drv-stm32h7-i2c-server"
7070
features = ["h743"]
7171
priority = 2
72-
requires = {flash = 16384, ram = 2048}
72+
max-sizes = {flash = 16384, ram = 2048}
7373
uses = ["i2c1", "i2c2", "i2c3", "i2c4"]
7474
start = true
7575
task-slots = ["sys"]
@@ -81,7 +81,7 @@ task-slots = ["sys"]
8181
[tasks.spi_driver]
8282
name = "drv-stm32h7-spi-server"
8383
priority = 2
84-
requires = {flash = 16384, ram = 2048}
84+
max-sizes = {flash = 16384, ram = 2048}
8585
features = ["spi1", "h743"]
8686
uses = ["spi1"]
8787
start = true
@@ -96,7 +96,7 @@ global_config = "spi1"
9696
name = "task-net"
9797
stacksize = 3800
9898
priority = 2
99-
requires = {flash = 65536, ram = 8192, sram1 = 32768}
99+
max-sizes = {flash = 65536, ram = 8192, sram1 = 32768}
100100
features = ["h743"]
101101
sections = {eth_bulk = "sram1"}
102102
uses = ["eth", "eth_dma", "system_flash"]
@@ -108,22 +108,22 @@ task-slots = ["sys"]
108108
name = "drv-user-leds"
109109
features = ["stm32h7"]
110110
priority = 2
111-
requires = {flash = 2048, ram = 1024}
111+
max-sizes = {flash = 2048, ram = 1024}
112112
start = true
113113
task-slots = ["sys"]
114114

115115
[tasks.ping]
116116
name = "task-ping"
117117
features = []
118118
priority = 4
119-
requires = {flash = 8192, ram = 1024}
119+
max-sizes = {flash = 8192, ram = 1024}
120120
start = true
121121
task-slots = [{peer = "pong"}]
122122

123123
[tasks.pong]
124124
name = "task-pong"
125125
priority = 3
126-
requires = {flash = 1024, ram = 1024}
126+
max-sizes = {flash = 1024, ram = 1024}
127127
start = true
128128
task-slots = ["user_leds"]
129129

@@ -133,15 +133,15 @@ features = ["stm32h743", "usart3"]
133133
uses = ["usart3"]
134134
interrupts = {"usart3.irq" = 1}
135135
priority = 3
136-
requires = {flash = 16384, ram = 4096}
136+
max-sizes = {flash = 16384, ram = 4096}
137137
stacksize = 2048
138138
start = true
139139
task-slots = ["sys"]
140140

141141
[tasks.udpecho]
142142
name = "task-udpecho"
143143
priority = 3
144-
requires = {flash = 16384, ram = 8192}
144+
max-sizes = {flash = 16384, ram = 8192}
145145
stacksize = 4096
146146
start = true
147147
task-slots = ["net"]
@@ -150,23 +150,23 @@ task-slots = ["net"]
150150
name = "task-hiffy"
151151
features = ["h743", "stm32h7", "itm", "i2c", "gpio", "spi", "rng"]
152152
priority = 4
153-
requires = {flash = 32768, ram = 32768 }
153+
max-sizes = {flash = 32768, ram = 32768 }
154154
stacksize = 2048
155155
start = true
156156
task-slots = ["sys", "i2c_driver", "rng_driver"]
157157

158158
[tasks.idle]
159159
name = "task-idle"
160160
priority = 5
161-
requires = {flash = 128, ram = 256}
161+
max-sizes = {flash = 128, ram = 256}
162162
stacksize = 256
163163
start = true
164164

165165
[tasks.rng_driver]
166166
features = ["h743"]
167167
priority = 3
168168
name = "drv-stm32h7-rng"
169-
requires = {flash = 8192, ram = 512}
169+
max-sizes = {flash = 8192, ram = 512}
170170
stacksize = 256
171171
start = true
172172
task-slots = ["sys", "user_leds"]

0 commit comments

Comments
 (0)