forked from RTduino/RTduino
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathRTduino.cpp
More file actions
171 lines (151 loc) · 4.65 KB
/
RTduino.cpp
File metadata and controls
171 lines (151 loc) · 4.65 KB
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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
/*
* Copyright (c) 2021-2024, RTduino Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* https://github.com/RTduino/RTduino
* https://gitee.com/rtduino/RTduino
*
* Change Logs:
* Date Author Notes
* 2021-12-10 Meco Man first version
* 2022-05-01 Meco Man support hardware timer
* 2022-05-20 Meco Man support no setup-loop structure
* 2023-06-22 Meco Man add auto-init macros and functions
*/
#include <RTduino.h>
#include "wiring_private.h"
#define DBG_TAG "RTduino.thread"
#define DBG_LVL DBG_INFO
#include <rtdbg.h>
/**
* @brief Entry point for the sketch loader thread.
*
* This function is the entry point for the sketch loader thread.
* It calls the setup function once, and then enters an infinite loop calling the loop function repeatedly.
*
* @param parameter A pointer to the sketch loader.
*/
static void rtduino_sketch_entry(void *parameter)
{
rtduino_loader_t loader = (rtduino_loader_t)parameter;
loader->setup();
while (1)
{
loader->loop();
}
}
rtduino_loader_t rtduino_sketch_loader_create_stacksize_prio(const char* name,
void (*setup)(void), void (*loop)(void), rt_uint32_t stack_size, rt_uint8_t priority)
{
rtduino_loader_t loader;
if (name == RT_NULL || setup == RT_NULL || loop == RT_NULL)
{
return RT_NULL;
}
loader = (rtduino_loader_t)rt_malloc(sizeof(rtduino_loader));
if (loader == RT_NULL)
{
return RT_NULL;
}
loader->name = name;
loader->setup = setup;
loader->loop = loop;
loader->thread = RT_NULL;
rt_thread_t thread = rt_thread_create(name, rtduino_sketch_entry,
(void *)loader, stack_size, priority, 20);
if (thread != RT_NULL)
{
loader->thread = thread;
rt_thread_startup(thread);
}
else
{
rt_free(loader);
loader = RT_NULL;
}
return loader;
}
rt_err_t rtduino_sketch_loader_delete(rtduino_loader_t loader)
{
rt_err_t err;
if (loader == RT_NULL)
{
return -RT_EINVAL;
}
err = rt_thread_delete(loader->thread);
if (err == RT_EOK)
{
rt_free(loader);
}
return err;
}
#ifdef RTDUINO_1US_HWTIMER_DEVICE_NAME
/**
* @brief Initializes the hardware timer used for the `macros()` function, if available.
*
* This hardware timer is to support the macros() function to deliver a
* 1us level counter. Normally, there should be some other option will be
* used. This timer just a alternative feature. If there is no other functions
* can be used. This hardware timer will be used.
*/
static void hwtimer_1us_init(void)
{
rt_device_t hwtimer_device;
hwtimer_device = rt_device_find(RTDUINO_1US_HWTIMER_DEVICE_NAME);
if (hwtimer_device != RT_NULL)
{
rt_hwtimer_mode_t mode = HWTIMER_MODE_PERIOD; /* periodic */
rt_uint32_t freq = 1000000; /* 1Mhz, 1us */
rt_hwtimerval_t val = {.sec=1, .usec=0}; /* callback interval */
if (rt_device_open(hwtimer_device, RT_DEVICE_OFLAG_RDWR) != RT_EOK)
{
LOG_E("Failed to open hardware timer: %s!", RTDUINO_1US_HWTIMER_DEVICE_NAME);
return;
}
rt_device_control(hwtimer_device, HWTIMER_CTRL_FREQ_SET, &freq); /* set hwtimer prescaler frequency */
rt_device_control(hwtimer_device, HWTIMER_CTRL_MODE_SET, &mode); /* set hwtimer mode */
if (rt_device_write(hwtimer_device, 0, &val, sizeof(val)) == 0)
{
LOG_E("Failed to start (write) hardware timer: %s!", RTDUINO_1US_HWTIMER_DEVICE_NAME);
}
}
else
{
LOG_W("Cannot find a hardware timer: %s!", RTDUINO_1US_HWTIMER_DEVICE_NAME);
}
}
#endif /* RTDUINO_1US_HWTIMER_DEVICE_NAME */
/**
* @brief Initializes the BSP variant.
*
* This function is called during library initialization to initialize the BSP variant.
* It can be left blank if no initialization is required.
*/
rt_weak void initVariant(void)
{
/* maybe a blank function and does nothing */
}
/**
* @brief Initializes the RTduino.
*
* This function is called during RT-Thread initialization to initialize the RTduino library.
* It initializes:
* - the hardware timer (if available)
* - calls the `initVariant()` function to initialize the BSP variant
* - creates the sketch loader
*
* @return RT_EOK if the initialization is successful.
*/
static int rtduino_init(void)
{
#ifdef RTDUINO_1US_HWTIMER_DEVICE_NAME
hwtimer_1us_init();
#endif /* RTDUINO_1US_HWTIMER_DEVICE_NAME */
initVariant();
#ifndef RTDUINO_NO_SETUP_LOOP
rtduino_sketch_loader_create("RTduino", setup, loop);
#endif /* RTDUINO_NO_SETUP_LOOP */
return 0;
}
INIT_COMPONENT_EXPORT(rtduino_init);