103 lines
2.2 KiB
C
103 lines
2.2 KiB
C
#include "tos_k.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();
|
|
}
|
|
|