source: azure_iot_hub_f767zi/trunk/azure_iot_sdk/c-utility/adapters/threadapi_toppers.c@ 457

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

ファイルを追加

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