wkupct回调函数会中断user_custs1_xxx_wr_ind_handler吗

⚠️
大家好. .感谢来到论坛。令人兴奋的消息!我们现在正在转移到新的论坛平台的过程中,它将提供更好的功能,并包含在主对话网站。所有的帖子和账号已经迁移。我们现在只接受新论坛的流量-请发布任何新的帖子在//www.wsdof.com/support。我们会在接下来的几天修复bug /优化搜索和标记。
6个员额/ 0个新员额
最后发表
运维
离线
最后看到:1年3个星期前
加入:2016-01-04 09:20
wkupct回调函数会中断user_custs1_xxx_wr_ind_handler吗

亲爱的对话支持团队;

我正在构建一个基于DA14583 SDK 5.0.4样例代码ble_app_peripheral的项目。

我们的项目与SPI G-Sensor和DA14583内部SPI Flash一起工作,但DA14583只有一个SPI控制器。

所以我们只能同时访问这些SPI设备中的一个。我们使用G-Sensor的中断引脚通知DA14583读取采样数据。

代码看起来像这样(简化):

-----------代码A --------------

wkupct_register_callback (wkup_callback);

wkupct_enable_irq(…);

空白wkup_callback () {

app_easy_timer_cb app_easy_timer(1日);

空白app_easy_timer_cb () {

(通过SPI接口访问G-Sensor读取采样数据)

用户通过ble特性的写操作发送命令,使系统将一些数据保存到内部SPI Flash中。

我在user_custs1_ctrl_wr_ind_handler()函数中实现了这个需求。

代码看起来像这样(简化):

-----------代码B ----------------

空白user_custs1_ctrl_wr_ind_handler(…){

if (param->value[0] == 0x01)(写入数据到SPI Flash)

我想问:“wkup_callback()函数或app_easy_timer_cb()函数(在代码A)中断执行user_custs1_ctrl_wr_ind_handler()函数(在代码B)?或者SDK API将确保这些回调函数或处理函数将完全执行,而不中断(中断)另一个回调或处理函数?简而言之,我是否面临竞争条件?我需要添加一些同步机制吗?

非常感谢。

设备:
PM_Dialog
离线
最后看到:19小时36分钟前
工作人员
加入:2018-02-08 11:03
嗨,运维,

嗨,运维,

老实说,我不能完全理解你想要完成什么。当为对等设备写入控制点特征时,user_custs1_ctrl_wr_ind_handler()将被触发。唤醒控制器一旦检测到唤醒中断,就会触发WKUP回调函数。如果设置了计时器,app_easy_timer_cb()将被触发。你能给我提供更多的信息吗?你设置好计时器了吗?另外,为什么不使用SPI闪存驱动程序中的api呢?

谢谢,PM_Dialog

运维
离线
最后看到:1年3个星期前
加入:2016-01-04 09:20
嗨,PM_Dialog;

嗨,PM_Dialog;

谢谢你的快速回复。

1.我确实使用SPI闪存驱动器访问内部闪存。在编写控制点特性时,可以将一些数据保存到flash中。这个工作很好。我的代码如下:

空白user_custs1_ctrl_wr_ind_handler(…){

GPIO_ConfigurePin(FLASH_CS_PORT, FLASH_CS_PIN, OUTPUT, PID_SPI_EN, true);
gpio_configurein (FLASH_CLK_PORT, FLASH_CLK_PIN, OUTPUT, PID_SPI_CLK, false);
GPIO_ConfigurePin(FLASH_DO_PORT, FLASH_DO_PIN, OUTPUT, PID_SPI_DO, false);
GPIO_ConfigurePin(FLASH_DI_PORT, FLASH_DI_PIN, INPUT, PID_SPI_DI, false);

spi_init(&spi_FLASH_CS_Pad, SPI_MODE_8BIT, SPI_ROLE_MASTER, SPI_CLK_IDLE_POL_LOW, SPI_PHA_MODE_0, SPI_MINT_DISABLE, SPI_XTAL_DIV_8);

spi_flash_init (SPI_FLASH_SIZE SPI_FLASH_PAGE);

/ /点

spi_flash_block_erase (ConfigAddress SECTOR_ERASE);

spi_flash_write_data (&configData[0], ConfigAddress, sizeof(configData));

...

2.我有一个g传感器,它会产生一个脉冲(DA14583的外部中断),当它的缓冲区是满的。当这个事件发生时,我使用WKUP回调函数从G-Sensor的buffer vis SPI接口读取所有数据。这也很好。但是,有时我注意到在这个WKUP回调函数中会发生错误。似乎我在WKUP回调函数上做了太多的工作,导致某些类型的超时!这就是为什么我使用app_easy_timer()在WKUP回调函数中调度一次app_easy_timer_cb()。这样,WKUP回调函数只做定时器调度工作,不会再引起超时。真正的工作留给app_easy_timer_cb()函数。这个策略对我有用,但如果不合适,纠正我!

因此,app_easy_timer_cb()如下所示:

空白app_easy_timer_cb (void) {

spi_init(&spi_GSensor_CS_Pad, SPI_MODE_8BIT, SPI_ROLE_MASTER, SPI_CLK_IDLE_POL_LOW, SPI_PHA_MODE_0, SPI_MINT_DISABLE, SPI_XTAL_DIV_8);

...//从SPI接口读取G-Sensor数据

3.问题来自Flash和G-Sensor都使用SPI接口,而DA14583只有一个SPI控制器!当我访问Flash时,我必须确保

GPIO_ConfigurePin(FLASH_CS_PORT, FLASH_CS_PIN, OUTPUT, PID_SPI_EN, true);
gpio_configurein (FLASH_CLK_PORT, FLASH_CLK_PIN, OUTPUT, PID_SPI_CLK, false);
GPIO_ConfigurePin(FLASH_DO_PORT, FLASH_DO_PIN, OUTPUT, PID_SPI_DO, false);
GPIO_ConfigurePin(FLASH_DI_PORT, FLASH_DI_PIN, INPUT, PID_SPI_DI, false);

spi_init(&spi_FLASH_CS_Pad, SPI_MODE_8BIT, SPI_ROLE_MASTER, SPI_CLK_IDLE_POL_LOW, SPI_PHA_MODE_0, SPI_MINT_DISABLE, SPI_XTAL_DIV_8);

spi_flash_init (SPI_FLASH_SIZE SPI_FLASH_PAGE);

在调用下面函数之前已执行。

spi_flash_write_data (&configData[0], ConfigAddress, sizeof(configData));

同样地,当我读取G-Sensor的数据时,我必须确保

GPIO_ConfigurePin(GSensor_CS_PORT, GSensor_CS_PIN, OUTPUT, PID_SPI_EN, true);
GPIO_ConfigurePin(GSensor_CLK_PORT, GSensor_CLK_PIN, OUTPUT, PID_SPI_CLK, false);
GPIO_ConfigurePin(GSensor_DO_PORT, GSensor_DO_PIN, OUTPUT, PID_SPI_DO, false);
GPIO_ConfigurePin(GSensor_DI_PORT, GSensor_DI_PIN, INPUT, PID_SPI_DI, false);

spi_init(&spi_GSensor_CS_Pad, SPI_MODE_8BIT, SPI_ROLE_MASTER, SPI_CLK_IDLE_POL_LOW, SPI_PHA_MODE_0, SPI_MINT_DISABLE, SPI_XTAL_DIV_8);

已执行。

由于G-Sensor总是连续地生成数据,它将导致定时调用WKUP回调。(在我的例子中,app_easy_timer_cb()也将被定期调用)

如果在写入控制点特性的同时G-Sensor的缓冲区满了呢?

我想知道是否会发生以下情况?

------------------------------------------------------------------

首先执行user_custs1_ctrl_wr_ind_handler()。

在这个处理函数中,

调用GPIO_ConfigurePin(…),然后调用spi_init(),然后调用spi_flash_init()。

然后在调用spi_flash_block_erase(…)函数之前(点A),触发app_easy_timer_cb()。

因此,user_custs1_ctrl_wr_ind_handler()停止(暂停)在点a执行,并开始执行app_easy_timer_cb()函数。

在app_easy_timer_cb()执行之后,user_custs1_ctrl_wr_ind_handler()从A点恢复执行。

-------------------------------------------------------------------

如果发生这种情况,它将使闪存写入失败。

或者SDK会在user_custs1_ctrl_wr_ind_handler()完成执行后执行app_easy_timer_cb() ?

谢谢。

PM_Dialog
离线
最后看到:19小时36分钟前
工作人员
加入:2018-02-08 11:03
嗨,运维,

嗨,运维,

谢谢你的详细反馈。让我查一下,我会尽快给你答复。

谢谢,PM_Dialog

运维
离线
最后看到:1年3个星期前
加入:2016-01-04 09:20
嗨,PM_Dialog;

嗨,PM_Dialog;

很高兴知道你在研究我的问题。期待您的回复。

非常感谢。

PM_Dialog
离线
最后看到:19小时36分钟前
工作人员
加入:2018-02-08 11:03
嗨,运维,

嗨,运维,

很抱歉回复晚了。当写入特征时,您必须停止带有SPI闪光的传感器事务,然后重新启动事务。两个外设同时具有SPI是不可能的。

谢谢,PM_Dialog