Skip to content

Commit 08066bd

Browse files
committed
Implemented fifo syscall
1 parent 4088906 commit 08066bd

File tree

7 files changed

+35
-7
lines changed

7 files changed

+35
-7
lines changed

context_switch.S

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ sleep:
77
bx lr
88

99
.global get_ticks
10-
kget_ticks:
10+
get_ticks:
1111
svc GET_TICKS_SVC_NUMBER
1212
bx lr
1313

@@ -16,6 +16,16 @@ sbrk:
1616
svc SBRK_SVC_NUMBER
1717
bx lr
1818

19+
.global register_fifo
20+
register_fifo:
21+
svc REGISTER_FIFO_SVC_NUMBER
22+
bx lr
23+
24+
.global unregister_fifo
25+
unregister_fifo:
26+
svc UNREGISTER_FIFO_SVC_NUMBER
27+
bx lr
28+
1929
.global activate
2030
activate:
2131
/* save kernel state in ip register */

fifo.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ static void fp_dtor(void *(*malloc)(size_t), void (*free)(void *), void *dst) {
1515
free(((FIFO *)dst)->data);
1616
}
1717

18-
ObjectPool fp_init(uint32_t size, void *(*malloc)(size_t), void *(*free)(size_t))
18+
ObjectPool fp_init(uint32_t size, void *(*malloc)(size_t), void (*free)(void *))
1919
{
2020
return op_allocate(size, sizeof(FIFO), malloc, free, fp_ctor, fp_dtor);
2121
}

fifo.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ typedef struct {
1616
} FIFOCreateInfo;
1717

1818
// Helper function for FIFO Pool
19-
ObjectPool fp_init(uint32_t size, void *(*malloc)(size_t), void *(*free)(size_t));
19+
ObjectPool fp_init(uint32_t size, void *(*malloc)(size_t), void (*free)(void *));
2020
FIFO fifo_init(void *data, uint32_t size);
2121
int32_t fifo_write(FIFO *fifo, void *buffer, int32_t count);
2222
int32_t fifo_read(FIFO *fifo, void *buffer, int32_t count);

main.c

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#include "syscall.h"
88
#include "priority_queue.h"
99
#include "malloc.h"
10+
#include "fifo.h"
1011
#include <tm_stm32f4_usb_hid_device.h>
1112

1213
const char *key_name[4][4] = {
@@ -41,6 +42,8 @@ struct TCB {
4142
struct TCB tasks[MAX_TASK];
4243
struct TCB *tasks_queue[MAX_TASK+1];
4344

45+
#define MAX_FIFO 10
46+
4447
static void init(void)
4548
{
4649
STM_EVAL_PBInit(BUTTON_USER, BUTTON_MODE_GPIO);
@@ -93,6 +96,8 @@ void main_task() {
9396
text[0] = '\0';
9497
IOInterface *interface = init_stm32_keybd();
9598

99+
int id = register_fifo(100);
100+
96101
while(TM_USB_HIDDEVICE_GetStatus() != TM_USB_HIDDEVICE_Status_Connected);
97102

98103
while(1) {
@@ -130,7 +135,6 @@ struct TCB create_task(uint32_t *space, void (*start)(), void *param, int stack_
130135
}
131136
// r0
132137
stack[9] = (uint32_t)param;
133-
stack = activate(stack);
134138
return (struct TCB) {.pid = next_pid++, .status=0, .orig_priority=priority,
135139
.priority=priority, .program_break=(uint8_t *)space, .stack=stack};
136140
}
@@ -161,7 +165,9 @@ int main(void)
161165
pq_push(&q, &tasks[i]);
162166
}
163167

168+
tasks[0].stack = activate(tasks[0].stack);
164169

170+
ObjectPool fifo_pool = fp_init(MAX_FIFO, kmalloc, kfree);
165171
while (1) {
166172
struct TCB *top;
167173
void *stored_tasks[MAX_TASK];
@@ -202,6 +208,15 @@ int main(void)
202208
*(int32_t *)param1 = -1;
203209
// skip aging technique
204210
continue;
211+
case REGISTER_FIFO_SVC_NUMBER:
212+
{
213+
FIFOCreateInfo info = {.size = *(int32_t *)param1};
214+
*(int32_t *)param1 = op_register(&fifo_pool, &info);
215+
}
216+
continue;
217+
case UNREGISTER_FIFO_SVC_NUMBER:
218+
op_unregister(&fifo_pool, *(int32_t *)param1);
219+
continue;
205220
}
206221
// no need to push back top
207222

object_pool.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,10 @@ int32_t op_register(ObjectPool *pool, void *args)
2828
{
2929
uint32_t i;
3030
for(i=0; i<pool->size; i++) {
31-
if(pool->objects[i].data) {
31+
if(pool->objects[i].data==NULL) {
3232
pool->objects[i].data = pool->malloc(pool->element_size);
3333
pool->ctor(pool->malloc, pool->free, pool->objects[i].data, args);
34+
break;
3435
}
3536
}
3637
return i<pool->size? (int32_t)i: -1;

syscall.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@
77
void sleep(uint32_t miliseconds);
88
uint32_t get_ticks();
99
void *sbrk(int32_t inc);
10-
int32_t create_fifo(uint32_t size);
11-
int32_t destroy_fifo(int32_t id);
10+
int32_t register_fifo(uint32_t size);
11+
int32_t unregister_fifo(int32_t id);
1212
// attach fifo to process
1313
int32_t attach_fifo(int32_t id);
1414
int32_t send(int32_t pid, int32_t tag, void *buf, int32_t count);

syscall_number.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,7 @@
55
#define SLEEP_SVC_NUMBER 2
66
#define GET_TICKS_SVC_NUMBER 3
77
#define SBRK_SVC_NUMBER 4
8+
#define REGISTER_FIFO_SVC_NUMBER 5
9+
#define UNREGISTER_FIFO_SVC_NUMBER 6
810

911
#endif

0 commit comments

Comments
 (0)