【セマフォ管理クラス】
セマフォ操作を管理する。
【修正】
2021-02-26
カウント値を制限できるように改良。制限値を1にするとイベント・フラグと同じ動作にすることができる。
【概要】
1 |
Sem(uint8_t init = 0, uint8_t limit = 0) |
セマフォを生成する。カウント初期値(init、省略時はゼロ)が指定可能。リミット(limit)は、カウント最大値を指定する。ゼロ指定はカウント変数の最大値までとなる。省略時はゼロ。
1 |
uint8_t acquire(int32_t timeout = WAIT_INFINITE); |
セマフォを獲得する。成功するとWAIT_OBJECTを返す。獲得できない場合、マイナスのタイムアウト指定では永久に待ち続け、ゼロ指定ではWAIT_TIMEOUTを即座に返す。1以上の指定時はその指定時間後にWAIT_TIMEOUTを返す。
1 |
bool release(void); |
セマフォを解放する。待ち状態にあるタスクがセマフォを獲得する。カウントアップできるとtrue、制限値によりカウント・アップできなかった場合はfalseを返す。
【ソース・コード】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
/* sem.h - Semaphore Function Class Copyright (c) 2021 Sasapea's Lab. All right reserved. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef __SEM_H #define __SEM_H #include <stdint.h> #include <stdbool.h> class Sem : public Wait { private: size_t _count; size_t _limit; public: Sem(uint8_t init = 0, uint8_t limit = 0); ~Sem(void); uint8_t acquire(int32_t timeout = WAIT_INFINITE); bool release(void); }; #endif |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
/* sem.h - Semaphore Function Class Copyright (c) 2021 Sasapea's Lab. All right reserved. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include <stdint.h> #include <stdbool.h> #include <util/atomic.h> #include "avros.h" Sem::Sem(uint8_t init, uint8_t limit) : _count(init) { _limit = _BV(sizeof(_count) << 3) - 1; if (limit && (limit < _limit)) _limit = limit; } Sem::~Sem(void) { } uint8_t Sem::acquire(int32_t timeout) { uint8_t rv = WAIT_TIMEOUT; ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { if (_count) { --_count; rv = WAIT_OBJECT; } else if (timeout) { rv = Wait::sleep(timeout); } } return rv; } bool Sem::release(void) { bool rv = true; ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { if (!Wait::wakeup()) { if (_count < _limit) ++_count; else rv = false; } } return rv; } |
【関連する投稿】
理想のRTOSを自作する (1)
理想のRTOSを自作する (2)
理想のRTOSを自作する (3)
理想のRTOSを自作する (4)
理想のRTOSを自作する (5)
理想のRTOSを自作する (6)
理想のRTOSを自作する (7)
理想のRTOSを自作する (8)
理想のRTOSを自作する (9)
理想のRTOSを自作する (10)
理想のRTOSを自作する (11)