OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3231|回复: 9

关于原子miniFly代码中,二值信号量的问题

[复制链接]

15

主题

25

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2018-12-24
在线时间
33 小时
发表于 2020-8-7 11:48:52 | 显示全部楼层 |阅读模式
10金钱
在同一个函数中,对一个二值信号量进行读和拿操作有什么意义呢?

是为了保护资源吗?但是代码也是从上到下去执行的,就算被其他任务打断也不会影响任务执行的顺序啊。求解!

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

152

帖子

0

精华

高级会员

Rank: 4

积分
777
金钱
777
注册时间
2016-7-15
在线时间
119 小时
发表于 2020-8-7 15:10:57 | 显示全部楼层
回复

使用道具 举报

3

主题

808

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3888
金钱
3888
注册时间
2017-3-7
在线时间
1694 小时
发表于 2020-8-7 15:52:22 | 显示全部楼层
有些变量不能随意修改,信号量,锁就是这个功能
回复

使用道具 举报

15

主题

25

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2018-12-24
在线时间
33 小时
 楼主| 发表于 2020-8-11 11:11:50 | 显示全部楼层

/*通过DMA发送原始数据*/
void uartslkSendDataDmaBlocking(u32 size, u8* data)
{
        if (isUartDmaInitialized)
        {
                xSemaphoreTake(uartBusy, portMAX_DELAY);
                while(DMA_GetCmdStatus(UARTSLK_DMA_STREAM) != DISABLE);        /*等待DMA空闲*/
                memcpy(dmaBuffer, data, size);                /*复制数据到DMA缓冲区*/
                DMA_InitStructure.DMA_BufferSize = size;
                initialDMACount = size;
                DMA_Init(UARTSLK_DMA_STREAM, &DMA_InitStructure);        /*重新初始化DMA数据流*/
                DMA_ITConfig(UARTSLK_DMA_STREAM, DMA_IT_TC, ENABLE);/*开启DMA传输完成中断*/               
                USART_DMACmd(UARTSLK_TYPE, USART_DMAReq_Tx, ENABLE);/* 使能USART DMA TX请求 */
                USART_ClearFlag(UARTSLK_TYPE, USART_FLAG_TC);                /* 清除传输完成中断标志位 */
                DMA_Cmd(UARTSLK_DMA_STREAM, ENABLE);        /* 使能DMA USART TX数据流 */
                xSemaphoreTake(waitUntilSendDone, portMAX_DELAY);
                xSemaphoreGive(uartBusy);
        }
}
回复

使用道具 举报

9

主题

219

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1437
金钱
1437
注册时间
2020-5-12
在线时间
395 小时
发表于 2020-8-11 11:34:32 | 显示全部楼层
本帖最后由 叶子君 于 2020-8-11 11:35 编辑
奔驰的战猪 发表于 2020-8-11 11:11
/*通过DMA发送原始数据*/
void uartslkSendDataDmaBlocking(u32 size, u8* data)
{

这就是普通的加锁吧。当你多处地方同时访问的时候,必须保证当前的参数不被修改,走完这个流程,才能激活下一次dma传输。
回复

使用道具 举报

15

主题

25

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2018-12-24
在线时间
33 小时
 楼主| 发表于 2020-8-11 12:31:06 | 显示全部楼层
叶子君 发表于 2020-8-11 11:34
这就是普通的加锁吧。当你多处地方同时访问的时候,必须保证当前的参数不被修改,走完这个流程,才能激活 ...

意思是外部有可能改变这段代码中,某个变量的值,所以用了这个二值信号量来加锁。但是程序都是从上到下执行的,如果外界改变了这个变量的值,这样的操作好像并不能避免啊。。
回复

使用道具 举报

9

主题

219

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1437
金钱
1437
注册时间
2020-5-12
在线时间
395 小时
发表于 2020-8-11 13:08:45 | 显示全部楼层
奔驰的战猪 发表于 2020-8-11 12:31
意思是外部有可能改变这段代码中,某个变量的值,所以用了这个二值信号量来加锁。但是程序都是从上到下执 ...

你放在实时操作系统就不是了,当你启动dma发送的时候,运行到while()这句话,系统可以调度其他任务的。
回复

使用道具 举报

15

主题

25

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2018-12-24
在线时间
33 小时
 楼主| 发表于 2020-8-11 21:50:56 | 显示全部楼层
叶子君 发表于 2020-8-11 13:08
你放在实时操作系统就不是了,当你启动dma发送的时候,运行到while()这句话,系统可以调度其他任务的。

感谢,但是还有个小问题,这样的二值信号量加锁机制,为什么可以保护到全局变量呢?难道每访问一次全局变量,就会判断代码块中是否有二值信号量被“Give”而没有被“Take”的这样一个逻辑吗?
回复

使用道具 举报

9

主题

219

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1437
金钱
1437
注册时间
2020-5-12
在线时间
395 小时
发表于 2020-8-12 10:32:53 | 显示全部楼层
奔驰的战猪 发表于 2020-8-11 21:50
感谢,但是还有个小问题,这样的二值信号量加锁机制,为什么可以保护到全局变量呢?难道每访问一次全局变 ...

这里没保护全局变量吧。这里保护的是dma传输的数据。
回复

使用道具 举报

9

主题

219

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1437
金钱
1437
注册时间
2020-5-12
在线时间
395 小时
发表于 2020-8-12 10:35:07 | 显示全部楼层
奔驰的战猪 发表于 2020-8-11 21:50
感谢,但是还有个小问题,这样的二值信号量加锁机制,为什么可以保护到全局变量呢?难道每访问一次全局变 ...

你要是保护全局变量,确实是这样做。但是我记得freertos里面有个叫消息队列的东西,可以代替这个。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-1 01:46

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表