first commit for opensource
first commit for opensource
This commit is contained in:
81
doc/code/2.2 task manager/main.c
Normal file
81
doc/code/2.2 task manager/main.c
Normal file
@@ -0,0 +1,81 @@
|
||||
#include "tos.h"
|
||||
#include "mcu_init.h"
|
||||
|
||||
#define STK_SIZE_TASK_PRIO4 512
|
||||
#define STK_SIZE_TASK_PRIO5 1024
|
||||
|
||||
|
||||
k_stack_t stack_task_prio4[STK_SIZE_TASK_PRIO4];
|
||||
k_stack_t stack_task_prio5[STK_SIZE_TASK_PRIO5];
|
||||
|
||||
k_task_t task_prio4;
|
||||
k_task_t task_prio5;
|
||||
|
||||
extern void entry_task_prio4(void *arg);
|
||||
extern void entry_task_prio5(void *arg);
|
||||
|
||||
uint32_t arg_task_prio4_array[3] = {
|
||||
1, 2, 3,
|
||||
};
|
||||
|
||||
char *arg_task_prio5_string = "arg for task_prio5";
|
||||
|
||||
void dump_uint32_array(uint32_t *array, size_t len)
|
||||
{
|
||||
size_t i = 0;
|
||||
|
||||
for (i = 0; i < len; ++i) {
|
||||
printf("%d\t", array[i]);
|
||||
}
|
||||
printf("\n\n");
|
||||
|
||||
}
|
||||
|
||||
void entry_task_prio4(void *arg)
|
||||
{
|
||||
uint32_t *array_from_main = (uint32_t *)arg;
|
||||
|
||||
printf("array from main:\n");
|
||||
dump_uint32_array(array_from_main, 3);
|
||||
|
||||
while (K_TRUE) {
|
||||
printf("task_prio4 body\n");
|
||||
tos_task_delay(1000);
|
||||
}
|
||||
}
|
||||
|
||||
void entry_task_prio5(void *arg)
|
||||
{
|
||||
int i = 0;
|
||||
char *string_from_main = (char *)arg;
|
||||
printf("string from main:\n");
|
||||
printf("%s\n\n", string_from_main);
|
||||
|
||||
while (K_TRUE) {
|
||||
if (i == 2) {
|
||||
printf("i = %d\n", i);
|
||||
tos_task_suspend(&task_prio4);
|
||||
} else if (i == 4) {
|
||||
printf("i = %d\n", i);
|
||||
tos_task_resume(&task_prio4);
|
||||
} else if (i == 6) {
|
||||
printf("i = %d\n", i);
|
||||
tos_task_destroy(&task_prio4);
|
||||
}
|
||||
printf("task_prio5 body\n");
|
||||
tos_task_delay(1000);
|
||||
++i;
|
||||
}
|
||||
}
|
||||
|
||||
int main(void)
|
||||
{
|
||||
board_init();
|
||||
tos_knl_init();
|
||||
(void)tos_task_create(&task_prio4, "task_prio4", entry_task_prio4, (void *)(&arg_task_prio4_array[0]),
|
||||
4, stack_task_prio4, STK_SIZE_TASK_PRIO4, 0);
|
||||
(void)tos_task_create(&task_prio5, "task_prio5", entry_task_prio5, (void *)arg_task_prio5_string, 5,
|
||||
stack_task_prio5, STK_SIZE_TASK_PRIO5, 0);
|
||||
tos_knl_start();
|
||||
}
|
||||
|
84
doc/code/2.3.1 mutex/main.c
Normal file
84
doc/code/2.3.1 mutex/main.c
Normal file
@@ -0,0 +1,84 @@
|
||||
#include "tos.h"
|
||||
#include "mcu_init.h"
|
||||
|
||||
#define STK_SIZE_TASK_WRITER 512
|
||||
#define STK_SIZE_TASK_READER 512
|
||||
|
||||
k_stack_t stack_task_writer[STK_SIZE_TASK_WRITER];
|
||||
k_stack_t stack_task_reader[STK_SIZE_TASK_READER];
|
||||
|
||||
k_task_t task_writer;
|
||||
k_task_t task_reader;
|
||||
|
||||
extern void entry_task_writer(void *arg);
|
||||
extern void entry_task_reader(void *arg);
|
||||
|
||||
k_mutex_t critical_resource_locker;
|
||||
|
||||
static uint32_t critical_resource[3];
|
||||
|
||||
static void write_critical_resource(int salt)
|
||||
{
|
||||
size_t i = 0;
|
||||
|
||||
printf("writting critical resource:\n");
|
||||
for (i = 0; i < 3; ++i) {
|
||||
printf("%d\t", salt + i);
|
||||
critical_resource[i] = salt + i;
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
void entry_task_writer(void *arg)
|
||||
{
|
||||
size_t salt = 0;
|
||||
k_err_t err;
|
||||
|
||||
while (K_TRUE) {
|
||||
err = tos_mutex_pend(&critical_resource_locker);
|
||||
if (err == K_ERR_NONE) {
|
||||
write_critical_resource(salt);
|
||||
tos_mutex_post(&critical_resource_locker);
|
||||
}
|
||||
tos_task_delay(1000);
|
||||
++salt;
|
||||
}
|
||||
}
|
||||
|
||||
static void read_critical_resource(void)
|
||||
{
|
||||
size_t i = 0;
|
||||
|
||||
printf("reading critical resource:\n");
|
||||
for (i = 0; i < 3; ++i) {
|
||||
printf("%d\t", critical_resource[i]);
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
void entry_task_reader(void *arg)
|
||||
{
|
||||
k_err_t err;
|
||||
|
||||
while (K_TRUE) {
|
||||
err = tos_mutex_pend(&critical_resource_locker);
|
||||
if (err == K_ERR_NONE) {
|
||||
read_critical_resource();
|
||||
tos_mutex_post(&critical_resource_locker);
|
||||
}
|
||||
tos_task_delay(1000);
|
||||
}
|
||||
}
|
||||
|
||||
int main(void)
|
||||
{
|
||||
board_init();
|
||||
tos_knl_init();
|
||||
tos_mutex_create(&critical_resource_locker);
|
||||
(void)tos_task_create(&task_writer, "writer", entry_task_writer, NULL,
|
||||
4, stack_task_writer, STK_SIZE_TASK_WRITER, 0);
|
||||
(void)tos_task_create(&task_reader, "reader", entry_task_reader, NULL,
|
||||
4, stack_task_reader, STK_SIZE_TASK_READER, 0);
|
||||
tos_knl_start();
|
||||
}
|
||||
|
102
doc/code/2.3.2 semaphore/main.c
Normal file
102
doc/code/2.3.2 semaphore/main.c
Normal file
@@ -0,0 +1,102 @@
|
||||
#include "tos.h"
|
||||
#include "mcu_init.h"
|
||||
|
||||
#define STK_SIZE_TASK_PRODUCER 512
|
||||
#define STK_SIZE_TASK_CONSUMER 512
|
||||
|
||||
k_stack_t stack_task_producer[STK_SIZE_TASK_PRODUCER];
|
||||
k_stack_t stack_task_consumer[STK_SIZE_TASK_CONSUMER];
|
||||
|
||||
k_task_t task_producer;
|
||||
k_task_t task_consumer;
|
||||
|
||||
extern void entry_task_producer(void *arg);
|
||||
extern void entry_task_consumer(void *arg);
|
||||
|
||||
k_mutex_t buffer_locker;
|
||||
k_sem_t full;
|
||||
k_sem_t empty;
|
||||
|
||||
#define RESOURCE_COUNT_MAX 3
|
||||
|
||||
struct resource_st {
|
||||
int cursor;
|
||||
uint32_t buffer[RESOURCE_COUNT_MAX];
|
||||
} resource = { 0, {0} };
|
||||
|
||||
static void produce_item(int salt)
|
||||
{
|
||||
printf("produce item:\n");
|
||||
|
||||
printf("%d", salt);
|
||||
resource.buffer[resource.cursor++] = salt;
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
void entry_task_producer(void *arg)
|
||||
{
|
||||
size_t salt = 0;
|
||||
k_err_t err;
|
||||
|
||||
while (K_TRUE) {
|
||||
err = tos_sem_pend(&empty, TOS_TIME_FOREVER);
|
||||
if (err != K_ERR_NONE) {
|
||||
continue;
|
||||
}
|
||||
err = tos_mutex_pend(&buffer_locker);
|
||||
if (err != K_ERR_NONE) {
|
||||
continue;
|
||||
}
|
||||
|
||||
produce_item(salt);
|
||||
|
||||
tos_mutex_post(&buffer_locker);
|
||||
tos_sem_post(&full);
|
||||
tos_task_delay(1000);
|
||||
++salt;
|
||||
}
|
||||
}
|
||||
|
||||
static void consume_item(void)
|
||||
{
|
||||
printf("cosume item:\n");
|
||||
printf("%d\t", resource.buffer[--resource.cursor]);
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
void entry_task_consumer(void *arg)
|
||||
{
|
||||
k_err_t err;
|
||||
|
||||
while (K_TRUE) {
|
||||
err = tos_sem_pend(&full, TOS_TIME_FOREVER);
|
||||
if (err != K_ERR_NONE) {
|
||||
continue;
|
||||
}
|
||||
tos_mutex_pend(&buffer_locker);
|
||||
if (err != K_ERR_NONE) {
|
||||
continue;
|
||||
}
|
||||
|
||||
consume_item();
|
||||
|
||||
tos_mutex_post(&buffer_locker);
|
||||
tos_sem_post(&empty);
|
||||
tos_task_delay(2000);
|
||||
}
|
||||
}
|
||||
|
||||
int main(void)
|
||||
{
|
||||
board_init();
|
||||
tos_knl_init();
|
||||
tos_mutex_create(&buffer_locker);
|
||||
tos_sem_create(&full, 0);
|
||||
tos_sem_create(&empty, RESOURCE_COUNT_MAX);
|
||||
(void)tos_task_create(&task_producer, "producer", entry_task_producer, NULL,
|
||||
4, stack_task_producer, STK_SIZE_TASK_PRODUCER, 0);
|
||||
(void)tos_task_create(&task_consumer, "consumer", entry_task_consumer, NULL,
|
||||
4, stack_task_consumer, STK_SIZE_TASK_CONSUMER, 0);
|
||||
tos_knl_start();
|
||||
}
|
||||
|
118
doc/code/2.3.3 event/main.c
Normal file
118
doc/code/2.3.3 event/main.c
Normal file
@@ -0,0 +1,118 @@
|
||||
#include "tos.h"
|
||||
#include "mcu_init.h"
|
||||
|
||||
#define STK_SIZE_TASK_LISTENER 512
|
||||
#define STK_SIZE_TASK_TRIGGER 512
|
||||
|
||||
k_stack_t stack_task_listener1[STK_SIZE_TASK_LISTENER];
|
||||
k_stack_t stack_task_listener2[STK_SIZE_TASK_LISTENER];
|
||||
k_stack_t stack_task_trigger[STK_SIZE_TASK_TRIGGER];
|
||||
|
||||
k_task_t task_listener1;
|
||||
k_task_t task_listener2;
|
||||
k_task_t task_trigger;
|
||||
|
||||
extern void entry_task_listener1(void *arg);
|
||||
extern void entry_task_listener2(void *arg);
|
||||
extern void entry_task_trigger(void *arg);
|
||||
|
||||
const k_event_flag_t event_eeny = (k_event_flag_t)(1 << 0);
|
||||
const k_event_flag_t event_meeny = (k_event_flag_t)(1 << 1);
|
||||
const k_event_flag_t event_miny = (k_event_flag_t)(1 << 2);
|
||||
const k_event_flag_t event_moe = (k_event_flag_t)(1 << 3);
|
||||
|
||||
k_event_t event;
|
||||
|
||||
void entry_task_listener1(void *arg)
|
||||
{
|
||||
k_event_flag_t flag_match;
|
||||
k_err_t err;
|
||||
|
||||
while (K_TRUE) {
|
||||
err = tos_event_pend(&event, event_eeny | event_meeny | event_miny | event_moe,
|
||||
&flag_match, TOS_TIME_FOREVER, TOS_OPT_EVENT_PEND_ALL | TOS_OPT_EVENT_PEND_CLR);
|
||||
if (err == K_ERR_NONE) {
|
||||
printf("entry_task_listener1:\n");
|
||||
printf("eeny, meeny, miny, moe, they all come\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void entry_task_listener2(void *arg)
|
||||
{
|
||||
k_event_flag_t flag_match;
|
||||
k_err_t err;
|
||||
|
||||
while (K_TRUE) {
|
||||
err = tos_event_pend(&event, event_eeny | event_meeny | event_miny | event_moe,
|
||||
&flag_match, TOS_TIME_FOREVER, TOS_OPT_EVENT_PEND_ANY | TOS_OPT_EVENT_PEND_CLR);
|
||||
if (err == K_ERR_NONE) {
|
||||
printf("entry_task_listener2:\n");
|
||||
if (flag_match == event_eeny) {
|
||||
printf("eeny comes\n");
|
||||
}
|
||||
if (flag_match == event_meeny) {
|
||||
printf("meeny comes\n");
|
||||
}
|
||||
if (flag_match == event_miny) {
|
||||
printf("miny comes\n");
|
||||
}
|
||||
if (flag_match == event_moe) {
|
||||
printf("moe comes\n");
|
||||
}
|
||||
if (flag_match == (event_eeny | event_meeny | event_miny | event_moe)) {
|
||||
printf("all come\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void entry_task_trigger(void *arg)
|
||||
{
|
||||
int i = 1;
|
||||
|
||||
while (K_TRUE) {
|
||||
if (i == 2) {
|
||||
printf("entry_task_trigger:\n");
|
||||
printf("eeny will come\n");
|
||||
tos_event_post(&event, event_eeny);
|
||||
}
|
||||
if (i == 3) {
|
||||
printf("entry_task_trigger:\n");
|
||||
printf("meeny will come\n");
|
||||
tos_event_post(&event, event_meeny);
|
||||
}
|
||||
if (i == 4) {
|
||||
printf("entry_task_trigger:\n");
|
||||
printf("miny will come\n");
|
||||
tos_event_post(&event, event_miny);
|
||||
}
|
||||
if (i == 5) {
|
||||
printf("entry_task_trigger:\n");
|
||||
printf("moe will come\n");
|
||||
tos_event_post(&event, event_moe);
|
||||
}
|
||||
if (i == 6) {
|
||||
printf("entry_task_trigger:\n");
|
||||
printf("all will come\n");
|
||||
tos_event_post(&event, event_eeny | event_meeny | event_miny | event_moe);
|
||||
}
|
||||
tos_task_delay(1000);
|
||||
++i;
|
||||
}
|
||||
}
|
||||
|
||||
int main(void)
|
||||
{
|
||||
board_init();
|
||||
tos_knl_init();
|
||||
tos_event_create(&event, (k_event_flag_t)0u);
|
||||
(void)tos_task_create(&task_listener1, "listener1", entry_task_listener1, NULL,
|
||||
3, stack_task_listener1, STK_SIZE_TASK_LISTENER, 0);
|
||||
(void)tos_task_create(&task_listener2, "listener2", entry_task_listener2, NULL,
|
||||
4, stack_task_listener2, STK_SIZE_TASK_LISTENER, 0);
|
||||
(void)tos_task_create(&task_trigger, "trigger", entry_task_trigger, NULL,
|
||||
4, stack_task_trigger, STK_SIZE_TASK_TRIGGER, 0);
|
||||
tos_knl_start();
|
||||
}
|
||||
|
103
doc/code/2.3.4 queue/main.c
Normal file
103
doc/code/2.3.4 queue/main.c
Normal file
@@ -0,0 +1,103 @@
|
||||
#include "tos.h"
|
||||
#include "mcu_init.h"
|
||||
|
||||
#define STK_SIZE_TASK_RECEIVER 512
|
||||
#define STK_SIZE_TASK_SENDER 512
|
||||
|
||||
#define PRIO_TASK_RECEIVER_HIGHER_PRIO 4
|
||||
#define PRIO_TASK_RECEIVER_LOWER_PRIO (PRIO_TASK_RECEIVER_HIGHER_PRIO + 1)
|
||||
|
||||
k_stack_t stack_task_receiver_higher_prio[STK_SIZE_TASK_RECEIVER];
|
||||
k_stack_t stack_task_receiver_lower_prio[STK_SIZE_TASK_RECEIVER];
|
||||
k_stack_t stack_task_sender[STK_SIZE_TASK_SENDER];
|
||||
|
||||
k_task_t task_receiver_higher_prio;
|
||||
k_task_t task_receiver_lower_prio;
|
||||
k_task_t task_sender;
|
||||
|
||||
k_queue_t queue;
|
||||
|
||||
extern void entry_task_receiver_higher_prio(void *arg);
|
||||
extern void entry_task_receiver_lower_prio(void *arg);
|
||||
extern void entry_task_sender(void *arg);
|
||||
|
||||
void entry_task_receiver_higher_prio(void *arg)
|
||||
{
|
||||
k_err_t err;
|
||||
void *msg_received;
|
||||
size_t msg_size;
|
||||
|
||||
while (K_TRUE) {
|
||||
err = tos_queue_pend(&queue, &msg_received, &msg_size, TOS_TIME_FOREVER);
|
||||
if (err == K_ERR_NONE) {
|
||||
printf("entry_task_receiver_higher_prio:\n");
|
||||
printf("message body: %s\n", (char *)msg_received);
|
||||
printf("message size: %d\n", msg_size);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void entry_task_receiver_lower_prio(void *arg)
|
||||
{
|
||||
k_err_t err;
|
||||
void *msg_received;
|
||||
size_t msg_size;
|
||||
|
||||
while (K_TRUE) {
|
||||
err = tos_queue_pend(&queue, &msg_received, &msg_size, TOS_TIME_FOREVER);
|
||||
if (err == K_ERR_NONE) {
|
||||
printf("entry_task_receiver_lower_prio:\n");
|
||||
printf("message body: %s\n", (char *)msg_received);
|
||||
printf("message size: %d\n", msg_size);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void entry_task_sender(void *arg)
|
||||
{
|
||||
int i = 1;
|
||||
char *msg_to_one_receiver = "message for one receiver[with highest priority]";
|
||||
char *msg_to_all_receiver = "message for all receivers";
|
||||
|
||||
while (K_TRUE) {
|
||||
if (i == 2) {
|
||||
printf("entry_task_sender:\n");
|
||||
printf("send a message to one receiver, and shoud be the highest priority one\n");
|
||||
tos_queue_post(&queue, msg_to_one_receiver, strlen(msg_to_one_receiver));
|
||||
}
|
||||
if (i == 3) {
|
||||
printf("entry_task_sender:\n");
|
||||
printf("send a message to all recevier\n");
|
||||
tos_queue_post_all(&queue, msg_to_all_receiver, strlen(msg_to_all_receiver));
|
||||
}
|
||||
if (i == 4) {
|
||||
printf("entry_task_sender:\n");
|
||||
printf("send a message to one receiver, and shoud be the highest priority one\n");
|
||||
tos_queue_post(&queue, msg_to_one_receiver, strlen(msg_to_one_receiver));
|
||||
}
|
||||
if (i == 5) {
|
||||
printf("entry_task_sender:\n");
|
||||
printf("send a message to all recevier\n");
|
||||
tos_queue_post_all(&queue, msg_to_all_receiver, strlen(msg_to_all_receiver));
|
||||
}
|
||||
tos_task_delay(1000);
|
||||
++i;
|
||||
}
|
||||
}
|
||||
|
||||
int main(void)
|
||||
{
|
||||
board_init();
|
||||
tos_knl_init();
|
||||
tos_queue_create(&queue);
|
||||
(void)tos_task_create(&task_receiver_higher_prio, "receiver_higher_prio",
|
||||
entry_task_receiver_higher_prio, NULL, PRIO_TASK_RECEIVER_HIGHER_PRIO,
|
||||
stack_task_receiver_higher_prio, STK_SIZE_TASK_RECEIVER, 0);
|
||||
(void)tos_task_create(&task_receiver_lower_prio, "receiver_lower_prio",
|
||||
entry_task_receiver_lower_prio, NULL, PRIO_TASK_RECEIVER_LOWER_PRIO,
|
||||
stack_task_receiver_lower_prio, STK_SIZE_TASK_RECEIVER, 0);
|
||||
(void)tos_task_create(&task_sender, "sender", entry_task_sender, NULL,
|
||||
4, stack_task_sender, STK_SIZE_TASK_SENDER, 0);
|
||||
tos_knl_start();
|
||||
}
|
||||
|
70
doc/code/2.4.1 mmheap/main.c
Normal file
70
doc/code/2.4.1 mmheap/main.c
Normal file
@@ -0,0 +1,70 @@
|
||||
#include "tos.h"
|
||||
#include "mcu_init.h"
|
||||
|
||||
#define STK_SIZE_TASK_DEMO 512
|
||||
|
||||
k_stack_t stack_task_demo[STK_SIZE_TASK_DEMO];
|
||||
|
||||
k_task_t task_demo;
|
||||
|
||||
extern void entry_task_demo(void *arg);
|
||||
|
||||
void entry_task_demo(void *arg)
|
||||
{
|
||||
void *p = K_NULL, *p_aligned = K_NULL;
|
||||
int i = 0;
|
||||
|
||||
while (K_TRUE) {
|
||||
if (i == 1) {
|
||||
p = tos_mmheap_alloc(0x30);
|
||||
if (p) {
|
||||
printf("alloc: %x\n", (cpu_addr_t)p);
|
||||
}
|
||||
} else if (i == 2) {
|
||||
if (p) {
|
||||
printf("free: %x\n", p);
|
||||
tos_mmheap_free(p);
|
||||
}
|
||||
} else if (i == 3) {
|
||||
p = tos_mmheap_alloc(0x30);
|
||||
if (p) {
|
||||
printf("alloc: %x\n", (cpu_addr_t)p);
|
||||
}
|
||||
} else if (i == 4) {
|
||||
p_aligned = tos_mmheap_aligned_alloc(0x50, 16);
|
||||
if (p_aligned) {
|
||||
printf("aligned alloc: %x\n", (cpu_addr_t)p_aligned);
|
||||
if ((cpu_addr_t)p_aligned % 16 == 0) {
|
||||
printf("%x is 16 aligned\n", (cpu_addr_t)p_aligned);
|
||||
} else {
|
||||
printf("should not happen\n");
|
||||
}
|
||||
}
|
||||
} else if (i == 5) {
|
||||
p = tos_mmheap_realloc(p, 0x40);
|
||||
if (p) {
|
||||
printf("realloc: %x\n", (cpu_addr_t)p);
|
||||
}
|
||||
} else if (i == 6) {
|
||||
if (p) {
|
||||
tos_mmheap_free(p);
|
||||
}
|
||||
if (p_aligned) {
|
||||
tos_mmheap_free(p_aligned);
|
||||
}
|
||||
}
|
||||
|
||||
tos_task_delay(1000);
|
||||
++i;
|
||||
}
|
||||
}
|
||||
|
||||
int main(void)
|
||||
{
|
||||
board_init();
|
||||
tos_knl_init();
|
||||
(void)tos_task_create(&task_demo, "receiver_higher_prio", entry_task_demo, NULL,
|
||||
4, stack_task_demo, STK_SIZE_TASK_DEMO, 0);
|
||||
tos_knl_start();
|
||||
}
|
||||
|
68
doc/code/2.4.2 mmblk/main.c
Normal file
68
doc/code/2.4.2 mmblk/main.c
Normal file
@@ -0,0 +1,68 @@
|
||||
#include "tos.h"
|
||||
#include "mcu_init.h"
|
||||
|
||||
#define STK_SIZE_TASK_DEMO 512
|
||||
|
||||
k_stack_t stack_task_demo[STK_SIZE_TASK_DEMO];
|
||||
|
||||
k_task_t task_demo;
|
||||
|
||||
|
||||
#define MMBLK_BLK_NUM 5
|
||||
#define MMBLK_BLK_SIZE 0x20
|
||||
|
||||
k_mmblk_pool_t mmblk_pool;
|
||||
|
||||
uint8_t mmblk_pool_buffer[MMBLK_BLK_NUM * MMBLK_BLK_SIZE];
|
||||
|
||||
void *p[MMBLK_BLK_NUM] = { K_NULL };
|
||||
|
||||
extern void entry_task_demo(void *arg);
|
||||
|
||||
void entry_task_demo(void *arg)
|
||||
{
|
||||
void *p_dummy = K_NULL;
|
||||
k_err_t err;
|
||||
int i = 0;
|
||||
|
||||
printf("mmblk_pool has %d blocks, size of each block is 0x%x\n", 5, 0x20);
|
||||
for (; i < MMBLK_BLK_NUM; ++i) {
|
||||
err = tos_mmblk_alloc(&mmblk_pool, &p[i]);
|
||||
if (err == K_ERR_NONE) {
|
||||
printf("%d block alloced: 0x%x\n", i, p[i]);
|
||||
} else {
|
||||
printf("should not happen\n");
|
||||
}
|
||||
}
|
||||
|
||||
err = tos_mmblk_alloc(&mmblk_pool, &p_dummy);
|
||||
if (err == K_ERR_MMBLK_POOL_EMPTY) {
|
||||
printf("blocks exhausted, all blocks is alloced\n");
|
||||
} else {
|
||||
printf("should not happen\n");
|
||||
}
|
||||
|
||||
for (i = 0; i < MMBLK_BLK_NUM; ++i) {
|
||||
err = tos_mmblk_free(&mmblk_pool, p[i]);
|
||||
if (err != K_ERR_NONE) {
|
||||
printf("should not happen\n");
|
||||
}
|
||||
}
|
||||
err = tos_mmblk_free(&mmblk_pool, p[0]);
|
||||
if (err == K_ERR_MMBLK_POOL_FULL) {
|
||||
printf("pool is full\n");
|
||||
} else {
|
||||
printf("should not happen\n");
|
||||
}
|
||||
}
|
||||
|
||||
int main(void)
|
||||
{
|
||||
board_init();
|
||||
tos_knl_init();
|
||||
tos_mmblk_pool_create(&mmblk_pool, mmblk_pool_buffer, MMBLK_BLK_NUM, MMBLK_BLK_SIZE);
|
||||
(void)tos_task_create(&task_demo, "receiver_higher_prio", entry_task_demo, NULL,
|
||||
4, stack_task_demo, STK_SIZE_TASK_DEMO, 0);
|
||||
tos_knl_start();
|
||||
}
|
||||
|
42
doc/code/2.5 time/main.c
Normal file
42
doc/code/2.5 time/main.c
Normal file
@@ -0,0 +1,42 @@
|
||||
#include "tos.h"
|
||||
#include "mcu_init.h"
|
||||
|
||||
#define STK_SIZE_TASK_DEMO 512
|
||||
|
||||
k_stack_t stack_task_demo[STK_SIZE_TASK_DEMO];
|
||||
|
||||
k_task_t task_demo;
|
||||
|
||||
extern void entry_task_demo(void *arg);
|
||||
|
||||
void entry_task_demo(void *arg)
|
||||
{
|
||||
k_time_t ms;
|
||||
k_tick_t systick, after_systick;
|
||||
|
||||
systick = tos_millisec2tick(2000);
|
||||
printf("%d millisec equals to %lld ticks\n", 2000, systick);
|
||||
|
||||
ms = tos_tick2millisec(1000);
|
||||
printf("%lld ticks equals to %d millisec\n", (k_tick_t)1000, ms);
|
||||
|
||||
systick = tos_systick_get();
|
||||
printf("before sleep, systick is %lld\n", systick);
|
||||
|
||||
tos_sleep_ms(2000);
|
||||
|
||||
after_systick = tos_systick_get();
|
||||
printf("after sleep %d ms, systick is %lld\n", 2000, after_systick);
|
||||
|
||||
printf("milliseconds sleep is about: %d\n", tos_tick2millisec(after_systick - systick));
|
||||
}
|
||||
|
||||
int main(void)
|
||||
{
|
||||
board_init();
|
||||
tos_knl_init();
|
||||
(void)tos_task_create(&task_demo, "receiver_higher_prio", entry_task_demo, NULL,
|
||||
4, stack_task_demo, STK_SIZE_TASK_DEMO, 0);
|
||||
tos_knl_start();
|
||||
}
|
||||
|
47
doc/code/2.6 timer/main.c
Normal file
47
doc/code/2.6 timer/main.c
Normal file
@@ -0,0 +1,47 @@
|
||||
#include "tos.h"
|
||||
#include "mcu_init.h"
|
||||
|
||||
#define STK_SIZE_TASK_DEMO 512
|
||||
|
||||
k_stack_t stack_task_demo[STK_SIZE_TASK_DEMO];
|
||||
|
||||
k_task_t task_demo;
|
||||
|
||||
extern void entry_task_demo(void *arg);
|
||||
|
||||
void oneshot_timer_cb(void *arg)
|
||||
{
|
||||
printf("this is oneshot timer callback, current systick: %lld\n", tos_systick_get());
|
||||
}
|
||||
|
||||
void periodic_timer_cb(void *arg)
|
||||
{
|
||||
printf("this is periodic timer callback, current systick: %lld\n", tos_systick_get());
|
||||
}
|
||||
|
||||
void entry_task_demo(void *arg)
|
||||
{
|
||||
k_timer_t oneshot_tmr;
|
||||
k_timer_t periodic_tmr;
|
||||
|
||||
tos_timer_create(&oneshot_tmr, 3000, 0, oneshot_timer_cb, K_NULL, TOS_OPT_TIMER_ONESHOT);
|
||||
tos_timer_create(&periodic_tmr, 2000, 3000, periodic_timer_cb, K_NULL, TOS_OPT_TIMER_PERIODIC);
|
||||
|
||||
printf("current systick: %lld\n", tos_systick_get());
|
||||
tos_timer_start(&oneshot_tmr);
|
||||
tos_timer_start(&periodic_tmr);
|
||||
|
||||
while (K_TRUE) {
|
||||
tos_task_delay(1000);
|
||||
}
|
||||
}
|
||||
|
||||
int main(void)
|
||||
{
|
||||
board_init();
|
||||
tos_knl_init();
|
||||
(void)tos_task_create(&task_demo, "receiver_higher_prio", entry_task_demo, NULL,
|
||||
4, stack_task_demo, STK_SIZE_TASK_DEMO, 0);
|
||||
tos_knl_start();
|
||||
}
|
||||
|
71
doc/code/2.7 robin/main.c
Normal file
71
doc/code/2.7 robin/main.c
Normal file
@@ -0,0 +1,71 @@
|
||||
#include "tos.h"
|
||||
#include "mcu_init.h"
|
||||
|
||||
#define STK_SIZE_TASK_DEMO 512
|
||||
#define STK_SIZE_TASK_SAMPLE 512
|
||||
|
||||
#define PRIO_TASK_DEMO 4
|
||||
#define PRIO_TASK_SAMPLE (PRIO_TASK_DEMO - 1)
|
||||
|
||||
const k_timeslice_t timeslice_demo1 = 10;
|
||||
const k_timeslice_t timeslice_demo2 = 20;
|
||||
|
||||
k_stack_t stack_task_demo1[STK_SIZE_TASK_DEMO];
|
||||
k_stack_t stack_task_demo2[STK_SIZE_TASK_DEMO];
|
||||
k_stack_t stack_task_sample[STK_SIZE_TASK_SAMPLE];
|
||||
|
||||
k_task_t task_demo1;
|
||||
k_task_t task_demo2;
|
||||
k_task_t task_sample;
|
||||
|
||||
extern void entry_task_demo1(void *arg);
|
||||
extern void entry_task_demo2(void *arg);
|
||||
extern void entry_task_sample(void *arg);
|
||||
|
||||
uint64_t demo1_counter = 0;
|
||||
uint64_t demo2_counter = 0;
|
||||
|
||||
void entry_task_demo1(void *arg)
|
||||
{
|
||||
while (K_TRUE) {
|
||||
++demo1_counter;
|
||||
}
|
||||
}
|
||||
|
||||
void entry_task_demo2(void *arg)
|
||||
{
|
||||
while (K_TRUE) {
|
||||
++demo2_counter;
|
||||
}
|
||||
}
|
||||
|
||||
void entry_task_sample(void *arg)
|
||||
{
|
||||
while (K_TRUE) {
|
||||
printf("demo1_counter: %lld\n", demo1_counter);
|
||||
printf("demo2_counter: %lld\n", demo2_counter);
|
||||
printf("demo2_counter / demo1_counter = %f\n",
|
||||
(double)demo2_counter / demo1_counter);
|
||||
printf("should almost equals to:\n");
|
||||
printf("timeslice_demo2 / timeslice_demo1 = %f\n\n", (double)timeslice_demo2 / timeslice_demo1);
|
||||
tos_task_delay(1000);
|
||||
}
|
||||
}
|
||||
|
||||
int main(void)
|
||||
{
|
||||
board_init();
|
||||
tos_knl_init();
|
||||
tos_robin_config(TOS_ROBIN_STATE_ENABLED, (k_timeslice_t)500u);
|
||||
(void)tos_task_create(&task_demo1, "demo1", entry_task_demo1, NULL,
|
||||
PRIO_TASK_DEMO, stack_task_demo1, STK_SIZE_TASK_DEMO,
|
||||
timeslice_demo1);
|
||||
(void)tos_task_create(&task_demo2, "demo2", entry_task_demo2, NULL,
|
||||
PRIO_TASK_DEMO, stack_task_demo2, STK_SIZE_TASK_DEMO,
|
||||
timeslice_demo2);
|
||||
(void)tos_task_create(&task_sample, "sample", entry_task_sample, NULL,
|
||||
PRIO_TASK_SAMPLE, stack_task_sample, STK_SIZE_TASK_SAMPLE,
|
||||
0);
|
||||
tos_knl_start();
|
||||
}
|
||||
|
123
doc/code/2.8.1 msg_queue/main.c
Normal file
123
doc/code/2.8.1 msg_queue/main.c
Normal file
@@ -0,0 +1,123 @@
|
||||
#include "tos.h"
|
||||
#include "mcu_init.h"
|
||||
|
||||
#define STK_SIZE_TASK_DEMO 512
|
||||
|
||||
#define PRIO_TASK_DEMO 4
|
||||
|
||||
k_stack_t stack_task_demo[STK_SIZE_TASK_DEMO];
|
||||
|
||||
k_task_t task_demo;
|
||||
|
||||
k_msg_queue_t msg_queue;
|
||||
|
||||
struct msg_st {
|
||||
char *msg;
|
||||
size_t size;
|
||||
} msgs[TOS_CFG_MSG_POOL_SIZE] = {
|
||||
{ "msg 0", 6 },
|
||||
{ "msg 1", 6 },
|
||||
{ "msg 2", 6 },
|
||||
};
|
||||
|
||||
struct msg_st dummy_msg = { "dummy msg", 10 };
|
||||
|
||||
extern void entry_task_demo(void *arg);
|
||||
|
||||
void fifo_opt(void) {
|
||||
k_err_t err;
|
||||
int i = 0;
|
||||
char *msg_received = K_NULL;
|
||||
size_t msg_size = 0;
|
||||
|
||||
for (; i < TOS_CFG_MSG_POOL_SIZE; ++i) {
|
||||
printf("msg put: %s\n", msgs[i].msg);
|
||||
err = tos_msg_queue_put(&msg_queue, (void *)msgs[i].msg, msgs[i].size, TOS_OPT_MSG_PUT_FIFO);
|
||||
if (err != K_ERR_NONE) {
|
||||
printf("should never happen\n");
|
||||
}
|
||||
}
|
||||
|
||||
err = tos_msg_queue_put(&msg_queue, (void *)dummy_msg.msg, dummy_msg.size, TOS_OPT_MSG_PUT_FIFO);
|
||||
if (err == K_ERR_MSG_QUEUE_FULL) {
|
||||
printf("msg queue is full\n");
|
||||
} else {
|
||||
printf("should never happen\n");
|
||||
}
|
||||
|
||||
for (i = 0; i < TOS_CFG_MSG_POOL_SIZE; ++i) {
|
||||
err = tos_msg_queue_get(&msg_queue, (void **)&msg_received, &msg_size);
|
||||
if (err == K_ERR_NONE) {
|
||||
printf("msg received: %s\n", msg_received);
|
||||
printf("msg size: %d\n", msg_size);
|
||||
} else {
|
||||
printf("should never happen\n");
|
||||
}
|
||||
}
|
||||
err = tos_msg_queue_get(&msg_queue, (void **)&msg_received, &msg_size);
|
||||
if (err == K_ERR_MSG_QUEUE_EMPTY) {
|
||||
printf("msg queue is empty\n");
|
||||
} else {
|
||||
printf("should never happen\n");
|
||||
}
|
||||
}
|
||||
|
||||
void lifo_opt(void) {
|
||||
k_err_t err;
|
||||
int i = 0;
|
||||
char *msg_received = K_NULL;
|
||||
size_t msg_size = 0;
|
||||
|
||||
for (; i < TOS_CFG_MSG_POOL_SIZE; ++i) {
|
||||
printf("msg put: %s\n", msgs[i].msg);
|
||||
err = tos_msg_queue_put(&msg_queue, (void *)msgs[i].msg, msgs[i].size, TOS_OPT_MSG_PUT_LIFO);
|
||||
if (err != K_ERR_NONE) {
|
||||
printf("should never happen\n");
|
||||
}
|
||||
}
|
||||
err = tos_msg_queue_put(&msg_queue, (void *)dummy_msg.msg, dummy_msg.size, TOS_OPT_MSG_PUT_LIFO);
|
||||
if (err == K_ERR_MSG_QUEUE_FULL) {
|
||||
printf("msg queue is full\n");
|
||||
} else {
|
||||
printf("should never happen\n");
|
||||
}
|
||||
|
||||
for (i = 0; i < TOS_CFG_MSG_POOL_SIZE; ++i) {
|
||||
err = tos_msg_queue_get(&msg_queue, (void **)&msg_received, &msg_size);
|
||||
if (err == K_ERR_NONE) {
|
||||
printf("msg received: %s\n", msg_received);
|
||||
printf("msg size: %d\n", msg_size);
|
||||
} else {
|
||||
printf("should never happen\n");
|
||||
}
|
||||
}
|
||||
err = tos_msg_queue_get(&msg_queue, (void **)&msg_received, &msg_size);
|
||||
if (err == K_ERR_MSG_QUEUE_EMPTY) {
|
||||
printf("msg queue is empty\n");
|
||||
} else {
|
||||
printf("should never happen\n");
|
||||
}
|
||||
}
|
||||
|
||||
void entry_task_demo(void *arg)
|
||||
{
|
||||
tos_msg_queue_create(&msg_queue);
|
||||
|
||||
printf("max msg in pool: %d\n", TOS_CFG_MSG_POOL_SIZE);
|
||||
printf("msg queue using TOS_OPT_MSG_PUT_FIFO\n");
|
||||
fifo_opt();
|
||||
|
||||
printf("msg queue using TOS_OPT_MSG_PUT_LIFO\n");
|
||||
lifo_opt();
|
||||
}
|
||||
|
||||
int main(void)
|
||||
{
|
||||
board_init();
|
||||
tos_knl_init();
|
||||
(void)tos_task_create(&task_demo, "demo1", entry_task_demo, NULL,
|
||||
PRIO_TASK_DEMO, stack_task_demo, STK_SIZE_TASK_DEMO,
|
||||
0);
|
||||
tos_knl_start();
|
||||
}
|
||||
|
114
doc/code/2.8.2 fifo/main.c
Normal file
114
doc/code/2.8.2 fifo/main.c
Normal file
@@ -0,0 +1,114 @@
|
||||
#include "tos.h"
|
||||
#include "mcu_init.h"
|
||||
|
||||
#define STK_SIZE_TASK_DEMO 512
|
||||
|
||||
#define PRIO_TASK_DEMO 4
|
||||
|
||||
k_stack_t stack_task_demo[STK_SIZE_TASK_DEMO];
|
||||
|
||||
k_task_t task_demo;
|
||||
|
||||
#define FIFO_BUFFER_SIZE 5
|
||||
uint8_t fifo_buffer[FIFO_BUFFER_SIZE];
|
||||
|
||||
k_fifo_t fifo;
|
||||
|
||||
extern void entry_task_demo(void *arg);
|
||||
|
||||
void char_push(void)
|
||||
{
|
||||
k_err_t err;
|
||||
int i = 0;
|
||||
uint8_t data;
|
||||
|
||||
for (i = 0; i < FIFO_BUFFER_SIZE; ++i) {
|
||||
printf("char pushed: %c\n", 'a' + i);
|
||||
err = tos_fifo_push(&fifo, 'a' + i);
|
||||
if (err != K_ERR_NONE) {
|
||||
printf("should never happen\n");
|
||||
}
|
||||
}
|
||||
|
||||
err = tos_fifo_push(&fifo, 'z');
|
||||
if (err == K_ERR_FIFO_FULL) {
|
||||
printf("fifo is full: %s\n", tos_fifo_is_full(&fifo) ? "TRUE" : "FALSE");
|
||||
} else {
|
||||
printf("should never happen\n");
|
||||
}
|
||||
|
||||
for (i = 0; i < FIFO_BUFFER_SIZE; ++i) {
|
||||
err = tos_fifo_pop(&fifo, &data);
|
||||
if (err == K_ERR_NONE) {
|
||||
printf("%d pop: %c\n", i, data);
|
||||
} else {
|
||||
printf("should never happen\n");
|
||||
}
|
||||
}
|
||||
err = tos_fifo_pop(&fifo, &data);
|
||||
if (err == K_ERR_FIFO_EMPTY) {
|
||||
printf("fifo is empty: %s\n", tos_fifo_is_empty(&fifo) ? "TRUE" : "FALSE");
|
||||
} else {
|
||||
printf("should never happen\n");
|
||||
}
|
||||
}
|
||||
|
||||
void stream_push(void)
|
||||
{
|
||||
int count = 0, i = 0;
|
||||
uint8_t stream[FIFO_BUFFER_SIZE] = { 'a', 'b', 'c', 'd', 'e' };
|
||||
uint8_t stream_dummy[1] = { 'z' };
|
||||
uint8_t stream_pop[FIFO_BUFFER_SIZE];
|
||||
|
||||
count = tos_fifo_push_stream(&fifo, &stream[0], FIFO_BUFFER_SIZE);
|
||||
if (count != FIFO_BUFFER_SIZE) {
|
||||
printf("should never happen\n");
|
||||
}
|
||||
|
||||
count = tos_fifo_push_stream(&fifo, &stream_dummy[0], 1);
|
||||
if (count == 0) {
|
||||
printf("fifo is full: %s\n", tos_fifo_is_full(&fifo) ? "TRUE" : "FALSE");
|
||||
} else {
|
||||
printf("should never happen\n");
|
||||
}
|
||||
|
||||
count = tos_fifo_pop_stream(&fifo, &stream_pop[0], FIFO_BUFFER_SIZE);
|
||||
if (count == FIFO_BUFFER_SIZE) {
|
||||
printf("stream popped:\n");
|
||||
for (i = 0; i < FIFO_BUFFER_SIZE; ++i) {
|
||||
printf("%c", stream_pop[i]);
|
||||
}
|
||||
printf("\n");
|
||||
} else {
|
||||
printf("should never happen\n");
|
||||
}
|
||||
|
||||
count = tos_fifo_pop_stream(&fifo, &stream_pop[0], 1);
|
||||
if (count == 0) {
|
||||
printf("fifo is empty: %s\n", tos_fifo_is_empty(&fifo) ? "TRUE" : "FALSE");
|
||||
} else {
|
||||
printf("should never happen\n");
|
||||
}
|
||||
}
|
||||
|
||||
void entry_task_demo(void *arg)
|
||||
{
|
||||
tos_fifo_create(&fifo, &fifo_buffer[0], FIFO_BUFFER_SIZE);
|
||||
|
||||
printf("fifo, dealing with char\n");
|
||||
char_push();
|
||||
|
||||
printf("fifo, dealing with stream\n");
|
||||
stream_push();
|
||||
}
|
||||
|
||||
int main(void)
|
||||
{
|
||||
board_init();
|
||||
tos_knl_init();
|
||||
(void)tos_task_create(&task_demo, "demo1", entry_task_demo, NULL,
|
||||
PRIO_TASK_DEMO, stack_task_demo, STK_SIZE_TASK_DEMO,
|
||||
0);
|
||||
tos_knl_start();
|
||||
}
|
||||
|
Reference in New Issue
Block a user