Skip to content

Commit de87deb

Browse files
committed
redistribute logic from test main.c to app_loader.c
1 parent a079451 commit de87deb

File tree

4 files changed

+184
-399
lines changed

4 files changed

+184
-399
lines changed

examples/tests/app_loader/abort-test/main.c

Lines changed: 32 additions & 139 deletions
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,11 @@
99

1010
#include "loadable_binaries.h"
1111

12-
13-
#define FLASH_BUFFER_SIZE 4096
14-
#define RETURNCODE_SUCCESS 0
15-
16-
static bool setup_done = false; // to check if setup is done
17-
static bool write_done = false; // to check if writing to flash is done
18-
static bool finalize_done = false; // to check if the kernel is done finalizing the process binary
19-
static bool load_done = false; // to check if the process was loaded successfully
20-
static bool abort_done = false; // to check if the process binary writing
21-
// was aborted successfully
12+
/******************************************************************************************************
13+
* Callback Tracking Flags
14+
******************************************************************************************************/
15+
static bool setup_done = false; // to check if setup is done
16+
static bool abort_done = false; // to check if write abort was successful
2217

2318
/******************************************************************************************************
2419
* Function Prototypes
@@ -28,9 +23,8 @@ void abort_test(void);
2823
/******************************************************************************************************
2924
* Callback functions
3025
*
31-
* 1. Callback to let us know when the capsule is done writing data to flash
32-
* 2. Set callback to initiate the dynamic app load process on receiving command from console
33-
*
26+
* 1. Set callback to initiate the dynamic app load process
27+
* 2. Set callback to call `abort()` with a timer
3428
*******************************************************************************************************/
3529

3630
static void app_setup_done_callback(__attribute__((unused)) int arg0,
@@ -40,48 +34,43 @@ static void app_setup_done_callback(__attribute__((unused)) int arg0,
4034
setup_done = true;
4135
}
4236

43-
static void app_write_done_callback(__attribute__((unused)) int arg0,
37+
static void app_abort_done_callback(__attribute__((unused)) int arg0,
4438
__attribute__((unused)) int arg1,
4539
__attribute__((unused)) int arg2,
4640
__attribute__((unused)) void* ud) {
47-
write_done = true;
48-
}
49-
50-
static void app_finalize_done_callback(__attribute__((unused)) int arg0,
51-
__attribute__((unused)) int arg1,
52-
__attribute__((unused)) int arg2,
53-
__attribute__((unused)) void* ud) {
54-
finalize_done = true;
41+
abort_done = true;
5542
}
5643

57-
static void app_load_done_callback(int arg0,
58-
__attribute__((unused)) int arg1,
59-
__attribute__((unused)) int arg2,
60-
__attribute__((unused)) void* ud) {
61-
62-
if (arg0 != RETURNCODE_SUCCESS) {
63-
printf("[Error] Process creation failed: %d.\n", arg0);
64-
} else {
65-
printf("[Success] Process created successfully.\n");
44+
static void abort_alarm_cb(__attribute__ ((unused)) uint32_t now,
45+
__attribute__ ((unused)) uint32_t scheduled,
46+
__attribute__ ((unused)) void* opaque) {
47+
printf("[Timer] Triggering abort now.\n");
48+
int ret = libtock_app_loader_abort(app_abort_done_callback);
49+
if (ret != RETURNCODE_SUCCESS) {
50+
printf("[Error] Abort Failed: %d.\n", ret);
6651
}
67-
load_done = true;
68-
}
6952

70-
static void app_abort_done_callback(__attribute__((unused)) int arg0,
71-
__attribute__((unused)) int arg1,
72-
__attribute__((unused)) int arg2,
73-
__attribute__((unused)) void* ud) {
74-
abort_done = true;
53+
// wait on abort done callback
54+
yield_for(&abort_done);
55+
abort_done = false;
56+
printf("[Success] Abort Successful.\n");
7557
}
7658

77-
// Callback for console commands.
59+
/******************************************************************************************************
60+
* Function to test the abort functionality of Tock's dynamic app loading feature set
61+
*
62+
* Takes callback function as argument
63+
******************************************************************************************************/
64+
7865
void abort_test(void) {
7966

67+
libtock_alarm_t abort_alarm;
68+
8069
unsigned char* app_data = (uint8_t*)(uintptr_t)binaries[0];
8170
size_t app_size = binary_sizes[0];
8271
size_t binary_size = actual_sizes[0];
8372

84-
int ret = libtock_app_loader_setup(app_size);
73+
int ret = libtock_app_loader_setup(app_size, app_setup_done_callback);
8574
if (ret != RETURNCODE_SUCCESS) {
8675
printf("[Error] Setup Failed: %d.\n", ret);
8776
tock_exit(ret);
@@ -91,79 +80,18 @@ void abort_test(void) {
9180
yield_for(&setup_done);
9281
setup_done = false;
9382

83+
libtock_alarm_in_ms(150, abort_alarm_cb, NULL, &abort_alarm);
84+
9485
printf("[Success] Setup successful. Writing app to flash.\n");
95-
int ret1 = write_app(binary_size, app_data);
86+
int ret1 = libtock_app_loader_write(binary_size, app_data);
9687
if (ret1 != RETURNCODE_SUCCESS) {
9788
printf("[Error] App flash write unsuccessful: %d.\n", ret1);
9889
tock_exit(ret1);
9990
}
10091
}
10192

102-
10393
/******************************************************************************************************
104-
*
105-
* Function to write the app into the flash
106-
*
107-
* Takes app size and the app binary as arguments
108-
******************************************************************************************************/
109-
110-
int write_app(double size, uint8_t binary[]) {
111-
112-
uint32_t write_count = 0;
113-
static uint8_t write_buffer[FLASH_BUFFER_SIZE];
114-
uint32_t flash_offset = 0;
115-
116-
// This value can be changed to different sizes
117-
// to mimic different bus widths.
118-
uint32_t write_buffer_size = FLASH_BUFFER_SIZE;
119-
120-
// set the write buffer
121-
int ret = libtock_app_loader_set_buffer(write_buffer, FLASH_BUFFER_SIZE);
122-
if (ret != RETURNCODE_SUCCESS) {
123-
printf("[Error] Failed to set the write buffer: %d.\n", ret);
124-
return -1;
125-
}
126-
127-
write_count = (size + write_buffer_size - 1) / write_buffer_size;
128-
129-
for (uint32_t offset = 0; offset < write_count; offset++) {
130-
131-
memset(write_buffer, 0, write_buffer_size);
132-
// copy binary to write buffer
133-
flash_offset = (offset * write_buffer_size);
134-
size_t bytes_left = size - flash_offset;
135-
size_t chunk = bytes_left < write_buffer_size ? bytes_left : write_buffer_size;
136-
memcpy(write_buffer, &binary[write_buffer_size * offset], chunk);
137-
int ret1 = libtock_app_loader_write(flash_offset, write_buffer_size);
138-
if (ret1 != 0) {
139-
printf("[Error] Failed writing data to flash at address: 0x%lx\n", flash_offset);
140-
printf("[Error] Error nature: %d\n", ret1);
141-
return -1;
142-
}
143-
// wait on write done callback
144-
yield_for(&write_done);
145-
write_done = false;
146-
}
147-
148-
printf("[Log] Aborting Setup/Write.\n");
149-
int ret0 = libtock_app_loader_abort();
150-
if (ret0 != RETURNCODE_SUCCESS) {
151-
printf("[Error] Abort Failed: %d.\n", ret0);
152-
}
153-
154-
// wait on abort done callback
155-
yield_for(&abort_done);
156-
abort_done = false;
157-
printf("[Success] Abort Successful.\n");
158-
159-
return 0;
160-
}
161-
162-
163-
/******************************************************************************************************
164-
*
16594
* Main
166-
*
16795
******************************************************************************************************/
16896

16997
int main(void) {
@@ -175,41 +103,6 @@ int main(void) {
175103
return -1;
176104
}
177105

178-
// set up the setup done callback
179-
int err1 = libtock_app_loader_set_setup_upcall(app_setup_done_callback, NULL);
180-
if (err1 != 0) {
181-
printf("[Error] Failed to set setup done callback: %d\n", err1);
182-
return err1;
183-
}
184-
185-
// set up the write done callback
186-
int err2 = libtock_app_loader_set_write_upcall(app_write_done_callback, NULL);
187-
if (err2 != 0) {
188-
printf("[Error] Failed to set flash write done callback: %d\n", err2);
189-
return err2;
190-
}
191-
192-
// set up the finalize done callback
193-
int err3 = libtock_app_loader_set_finalize_upcall(app_finalize_done_callback, NULL);
194-
if (err3 != 0) {
195-
printf("[Error] Failed to set finalize done callback: %d\n", err3);
196-
return err3;
197-
}
198-
199-
// set up the load done callback
200-
int err4 = libtock_app_loader_set_load_upcall(app_load_done_callback, NULL);
201-
if (err4 != 0) {
202-
printf("[Error] Failed to set load done callback: %d\n", err4);
203-
return err4;
204-
}
205-
206-
// set up the abort done callback
207-
int err5 = libtock_app_loader_set_abort_upcall(app_abort_done_callback, NULL);
208-
if (err5 != 0) {
209-
printf("[Error] Failed to set abort done callback: %d\n", err5);
210-
return err5;
211-
}
212-
213106
libtocksync_alarm_delay_ms(5000);
214107

215108
printf("[Log] Initiating Abort Test.\n");

0 commit comments

Comments
 (0)