source: azure_iot_hub/trunk/azure_iohub/c-utility/adapters/threadapi_toppers.c@ 388

Last change on this file since 388 was 388, checked in by coas-nagasima, 5 years ago

Azure IoT Hub Device C SDK を使ったサンプルの追加

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
  • Property svn:mime-type set to text/x-csrc
File size: 5.4 KB
Line 
1/*
2 * TOPPERS ECHONET Lite Communication Middleware
3 *
4 * Copyright (C) 2019 Cores Co., Ltd. Japan
5 *
6 * 上記著作権者
7は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
8 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
9 * 変・再é…
10å¸ƒï¼ˆä»¥ä¸‹ï¼Œåˆ©ç”¨ã¨å‘¼ã¶ï¼‰ã™ã‚‹ã“とを無償で許諾する.
11 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
12 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
13 * スコード中に含まれていること.
14 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
15 * 用できる形で再é…
16å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
17å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
18 * 者
19マニュアルなど)に,上記の著作権表示,この利用条件および下記
20 * の無保証規定を掲載すること.
21 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
22 * 用できない形で再é…
23å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
24 * と.
25 * (a) 再é…
26å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
27マニュアルなど)に,上記の著
28 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
29 * (b) 再é…
30å¸ƒã®å½¢æ…
31‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
32 * 報告すること.
33 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
34 * 害からも,上記著作権者
35およびTOPPERSプロジェクトをå…
36è²¬ã™ã‚‹ã“と.
37 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
38 * 由に基づく請求からも,上記著作権者
39およびTOPPERSプロジェクトを
40 * å…
41è²¬ã™ã‚‹ã“と.
42 *
43 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者
44お
45 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
46 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
47 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
48 * の責任を負わない.
49 *
50 * @(#) $Id: threadapi_toppers.c 388 2019-05-22 11:25:18Z coas-nagasima $
51 */
52#include <stdint.h>
53#include <stdlib.h>
54#include <kernel.h>
55#include <t_stdlib.h>
56#include "azure_c_shared_utility/threadapi.h"
57#include "azure_c_shared_utility/xlogging.h"
58
59MU_DEFINE_ENUM_STRINGS(THREADAPI_RESULT, THREADAPI_RESULT_VALUES);
60
61#ifdef TOPPERS_SUPPORT_DYNAMIC_CRE
62#define MAX_THREADS 4
63#define TASK_PRIORITY ((TMAX_TPRI + TMIN_TPRI) / 2)
64
65typedef struct _thread
66{
67 ID tskid;
68 int result;
69} toppersThread;
70static toppersThread threads[MAX_THREADS] = { 0 };
71#endif
72
73THREADAPI_RESULT ThreadAPI_Create(THREAD_HANDLE* threadHandle, THREAD_START_FUNC func, void* arg)
74{
75#ifndef TOPPERS_SUPPORT_DYNAMIC_CRE
76 LogError("TOPPERS/ASP3 does not support multi-thread function.");
77 return THREADAPI_ERROR;
78#else
79 THREADAPI_RESULT result;
80 if ((threadHandle == NULL) ||
81 (func == NULL))
82 {
83 result = THREADAPI_INVALID_ARG;
84 LogError("(result = %s)", MU_ENUM_TO_STRING(THREADAPI_RESULT, result));
85 }
86 else {
87 ER_ID ret;
88 T_CTSK ctsk;
89 toppersThread *thread = NULL;
90
91 for (int i = 0; i < MAX_THREADS; i++) {
92 if (threads[i].tskid == 0) {
93 thread = &threads[i];
94 break;
95 }
96 }
97
98 memset(&ctsk, 0, sizeof(ctsk));
99
100 ctsk.exinf = (intptr_t)arg;
101 ctsk.task = (TASK)func;
102 ctsk.itskpri = TASK_PRIORITY;
103
104 ret = acre_tsk(&ctsk);
105 if (ret > 0) {
106 if (thread == NULL) {
107 for (int i = 0; i < MAX_THREADS; i++) {
108 if (threads[i].tskid == ret) {
109 thread = &threads[i];
110 break;
111 }
112 }
113 }
114 if (thread != NULL) {
115 thread->result = 0;
116 }
117 if (act_tsk(ret) == E_OK) {
118 *threadHandle = (THREAD_HANDLE)(ret);
119 result = THREADAPI_OK;
120 }
121 else {
122 del_tsk(ret);
123 result = THREADAPI_ERROR;
124 LogError("(result = %s)", MU_ENUM_TO_STRING(THREADAPI_RESULT, result));
125 }
126 }
127 else {
128 result = THREADAPI_NO_MEMORY;
129 LogError("(result = %s)", MU_ENUM_TO_STRING(THREADAPI_RESULT, result));
130 }
131 }
132
133 return result;
134#endif
135}
136
137THREADAPI_RESULT ThreadAPI_Join(THREAD_HANDLE threadHandle, int *res)
138{
139#ifndef TOPPERS_SUPPORT_DYNAMIC_CRE
140 LogError("TOPPERS/ASP3 does not support multi-thread function.");
141 return THREADAPI_ERROR;
142#else
143 ID tskid = (ID)threadHandle;
144 T_RTSK rtsk;
145 toppersThread *thread = NULL;
146 ER ret;
147
148 for (;;) {
149 ret = ref_tsk(tskid, &rtsk);
150 if ((ret != E_OK) || (rtsk.tskstat == TTS_DMT))
151 break;
152
153 dly_tsk(10000);
154 }
155
156 for (int i = 0; i < MAX_THREADS; i++) {
157 if (threads[i].tskid == ret) {
158 thread = &threads[i];
159 break;
160 }
161 }
162
163 if (thread != NULL) {
164 *res = thread->result;
165 }
166
167 return THREADAPI_OK;
168#endif
169}
170
171void ThreadAPI_Exit(int res)
172{
173 ER ret;
174#ifdef TOPPERS_SUPPORT_DYNAMIC_CRE
175 ID tskid;
176
177 ret = get_tid(&tskid);
178 if (ret != E_OK) {
179 LogError("get_tid error. %s", itron_strerror(ret));
180 return;
181 }
182
183 for (int i = 0; i < MAX_THREADS; i++) {
184 if (threads[i].tskid == tskid) {
185 threads[i].result = res;
186 break;
187 }
188 }
189#endif
190 ret = ext_tsk();
191 if (ret != E_OK) {
192 LogError("ext_tsk error. %s", itron_strerror(ret));
193 }
194}
195
196void ThreadAPI_Sleep(unsigned int milliseconds)
197{
198 ER ret;
199
200 ret = dly_tsk((RELTIM)milliseconds * 1000);
201 if (ret != E_OK) {
202 LogError("dly_tsk error. %s", itron_strerror(ret));
203 }
204}
Note: See TracBrowser for help on using the repository browser.