This commit is contained in:
NIIBE Yutaka
2017-12-14 19:04:01 +09:00
parent 9f9aeae4bf
commit 499e575528
3 changed files with 53 additions and 8 deletions

23
bb.c
View File

@@ -32,9 +32,10 @@
#include <bb.h> #include <bb.h>
void void
bb_init (struct bb *bb, uint32_t items) bb_init (struct bb *bb, uint32_t max_item)
{ {
bb->items = items; bb->items = 0;
bb->max_items = max_item;
chopstx_cond_init (&bb->cond); chopstx_cond_init (&bb->cond);
chopstx_mutex_init (&bb->mutex); chopstx_mutex_init (&bb->mutex);
} }
@@ -53,26 +54,36 @@ void
bb_put (struct bb *bb) bb_put (struct bb *bb)
{ {
chopstx_mutex_lock (&bb->mutex); chopstx_mutex_lock (&bb->mutex);
while (bb->items == bb->max_item)
chopstx_cond_wait (&bb->cond, &bb->mutex);
bb->items++; bb->items++;
chopstx_cond_signal (&bb->cond); chopstx_cond_signal (&bb->cond);
chopstx_mutex_unlock (&bb->mutex); chopstx_mutex_unlock (&bb->mutex);
} }
static int static int
bb_check (void *arg) bb_check_empty (void *arg)
{ {
struct bb *bb = arg; struct bb *bb = arg;
return bb->items != 0; return bb->items != 0;
} }
static int
bb_check_full (void *arg)
{
struct bb *bb = arg;
return bb->items != bb->max_item;
}
void void
bb_prepare_poll (struct bb *bb, chopstx_poll_cond_t *p) bb_prepare_poll (struct bb *bb, chopstx_poll_cond_t *p, int full)
{ {
poll_desc->type = CHOPSTX_POLL_COND; poll_desc->type = CHOPSTX_POLL_COND;
poll_desc->ready = 0; poll_desc->ready = 0;
poll_desc->cond = &bb->cond; poll_desc->cond = &bb->cond;
poll_desc->mutex = &bb->mutex; poll_desc->mutex = &bb->mutex;
poll_desc->check = bb_check; poll_desc->check = full? bb_check_full: bb_check_empty;
poll_desc->arg = ev; poll_desc->arg = bb;
} }

5
bb.h
View File

@@ -2,10 +2,11 @@ struct bb {
chopstx_mutex_t mutex; chopstx_mutex_t mutex;
chopstx_cond_t cond; chopstx_cond_t cond;
uint32_t items; uint32_t items;
uint32_t max_item;
}; };
void bb_init (struct bb *bb, uint32_t items); void bb_init (struct bb *bb, uint32_t max_item);
void bb_get (struct bb *bb); void bb_get (struct bb *bb);
void bb_put (struct bb *bb); void bb_put (struct bb *bb);
void bb_prepare_poll (struct bb *bb, chopstx_poll_cond_t *p); void bb_prepare_poll (struct bb *bb, chopstx_poll_cond_t *p, int full);

33
contrib/usart-stm32f103.c Normal file
View File

@@ -0,0 +1,33 @@
/*
* usart-stm32f103.c - USART driver for STM32F103
*
* Copyright (C) 2017 g10 Code GmbH
* Author: NIIBE Yutaka <gniibe@fsij.org>
*
* This file is a part of Chopstx, a thread library for embedded.
*
* Chopstx is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Chopstx is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* As additional permission under GNU GPL version 3 section 7, you may
* distribute non-source form of the Program without the copy of the
* GNU GPL normally required by section 4, provided you inform the
* receipents of GNU GPL by a written offer.
*
*/
#include <stdint.h>
#include <stdlib.h>
#include <chopstx.h>
#include <mcu/stm32.h>
#include <mcu/stm32f103.h>