【GD32L233C-START评测】5,多值信号量
[复制链接]
其实,它和单值原理是一样的,就是get时是减一,release时是加一。
单值是只要有一,就GET一下罢了。
那么,接着上个程序我再建立个信号量,开始是10,这次我每进入一次线程就加一,直到加到了30。然后点亮一个灯。
#include "gd32l23x.h"
#include "systick.h"
#include "rtthread.h"
static rt_thread_t led1_thr = RT_NULL;
static rt_thread_t delay_thr = RT_NULL;
static rt_sem_t sem_led = RT_NULL;
static rt_sem_t sem_dec = RT_NULL;
//struct rt_semaphore sem_mult;
static void thread_led1_entry(void *parameter);
static void thread_delay_entry(void *parameter);
/*!
\brief main function
\param[in] none
\param[out] none
\retval none
*/
int main(void)
{
systick_config();
/* enable the LED GPIO clock */
rcu_periph_clock_enable(RCU_GPIOA);
rcu_periph_clock_enable(RCU_GPIOC);
/* configure LED GPIO pin */
gpio_mode_set(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_7 | GPIO_PIN_8);
gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_7 | GPIO_PIN_8);
gpio_mode_set(GPIOC, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_6 | GPIO_PIN_7);
gpio_output_options_set(GPIOC, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_6 | GPIO_PIN_7);
/* reset LED GPIO pin */
gpio_bit_reset(GPIOA, GPIO_PIN_7 | GPIO_PIN_8);
gpio_bit_reset(GPIOC, GPIO_PIN_6 | GPIO_PIN_7);
sem_led = rt_sem_create("sled",0,RT_IPC_FLAG_FIFO);
sem_dec = rt_sem_create("dec",10,RT_IPC_FLAG_FIFO);
led1_thr = rt_thread_create( "led1", /*????*/
thread_led1_entry,/*??????*/
RT_NULL,/*????????*/
256, /*?????*/
4 , /*?????*/
20); /*?????*/
rt_thread_startup(led1_thr);
delay_thr = rt_thread_create("delay",
thread_delay_entry,
RT_NULL,
256,
4,
20
);
rt_thread_startup(delay_thr);
sem_led = rt_sem_create("ssled",1,RT_IPC_FLAG_FIFO);
while(1) {
// /* turn on LED1, turn off LED4 */
// gpio_bit_set(GPIOA, GPIO_PIN_7);
// gpio_bit_reset(GPIOC, GPIO_PIN_7);
// delay_1ms(500);
// /* turn on LED2, turn off LED1 */
// gpio_bit_set(GPIOA, GPIO_PIN_8);
// gpio_bit_reset(GPIOA, GPIO_PIN_7);
// delay_1ms(500);
// /* turn on LED3, turn off LED2 */
// gpio_bit_set(GPIOC, GPIO_PIN_6);
// gpio_bit_reset(GPIOA, GPIO_PIN_8);
// delay_1ms(500);
// /* turn on LED4, turn off LED3 */
// gpio_bit_set(GPIOC, GPIO_PIN_7);
// gpio_bit_reset(GPIOC, GPIO_PIN_6);
// delay_1ms(500);
rt_thread_mdelay(100);
}
}
static void thread_led1_entry(void *parameter)
{
while(1)
{
rt_sem_take(sem_led,RT_WAITING_FOREVER);
gpio_bit_toggle(GPIOC,GPIO_PIN_7);
rt_thread_mdelay(500);
rt_sem_release(sem_led);
}
}
static void thread_delay_entry(void *parameter)
{
while(1)
{
rt_sem_release(sem_led);
rt_thread_mdelay(1000);
rt_sem_take(sem_led,RT_WAITING_FOREVER);
rt_sem_release(sem_dec);
if(sem_dec->value == 30)
gpio_bit_set(GPIOC, GPIO_PIN_6);
}
}
上边经运行,达到了预期效果。
|