你好对话框,
是kernel和sdk调用da14581 / sdk 5.0.x重新参与者safe(例如,ke_msg_alloc(),ke_msg_send(),arch_restore_sleep_mode(),arch_force_active_mode())?我们确实从ISR和App任务中进行了这些呼叫。
是否有任何电话,我们绝对不会来自ISR?
谢谢!
嗨jameshiebert,
你能澄清你的意思是“重新参加安全保险箱”?您可以从ISR调用这些函数,但是如果您得到另一个中断,并且将再次触发ISR,则不会有任何其他问题。强烈建议在条件下使用这些功能而不是来自ISR。
谢谢,PM_DIALOG.
PM_DIALOG,
我的意思是重新参加者安全是以下内容:1.任务T正在运行...2.发生中断并且处理程序H运行以处理中断。3.处理程序H还调用功能F.4.处理程序H完成并返回对任务T的控制,恢复运行功能F.
在这一点上,Funce F的表现可预测?如果Function F访问静态或全局变量,则可能发生不可预测的问题,具体取决于功能f的设计以及中断发生时。
如果您调用两次KE_MSG_ALLOC(),您将分配两次消息。与ke_msg_send()相同,如果您调用两次,则会将其调用两次,内核消息将被发送两次。ARCH_RESTORE_SLEEP_MODE()将休眠模式还原到禁用前的内容,并且ARCH_FORCE_ACTE_MODE()将ΔISAILABLEACE休眠,但保存睡眠模式状态,因此如果ARCH_RESTORE_SLEEP_MODE将调用两次,则ARCH_FORCE_ACTE_MODE()也应调用两次。强烈建议在条件下使用这些功能,如果您想将它们用入ISR。您是否在ISR中使用这些功能?
嗨pm_dialog,
是的,ARCH_RESTORE_SLEEP_MODE(),ARCH_FORCE_ACTE_MODE(),KE_MSG_ALLOC()和KE_MSG_SEND()都从ISR调用。
我明白,呼叫函数不止一次,应该导致他们的行为不止一次。但是,如果执行是在ke_msg_alloc()(或ke_msg_send())中间的中间时何时发生中断并且ke_msg_alloc()(或ke_msg_send())再次从ISR调用?执行这两个函数掩码在执行时中断吗?
要防范此方案,我可以在Arch_restore_sleep_mode()和Arch_force_active_mode()中屏蔽和恢复中断(或者将来自任务的呼叫与ke_msg_alloc()和ke_msg_send()的调用一起围绕,其中代码如果未保护这些后两个,则使用代码掩码和恢复中断的代码)。我需要吗?
谢谢。
您能从Arch_restore_sleep_mode()和Arch_Force_Active_Mode()的源代码中看到,这些功能不会屏蔽中断。关于ke_msg_alloc()和ke_msg_send()函数,让我检查一下,我会尽快回复您。
我检查了ke_msg_alloc()和ke_msg_send()函数的源代码,它们都禁用ARCH_RESTORE_SLEEP_MODE()和ARCH_FORCE_ACTE_MODE()函数的中断。
对不起,我对你的最后一个帖子混淆了,它说“... ke_msg_alloc()和ke_msg_send()函数,并且两个函数都禁用Arch_restore_sleep_mode()和Arch_force_active_mode()函数的中断。”您似乎暗示所有4个功能禁用中断。但是,函数ARCH_RESTORE_SLEEP_MODE()和ARCH_FORCE_ACTION_MODE()不禁用中断。你是说ke_msg_alloc()和ke_msg_send()函数做或不禁用中断吗?
我为混乱道歉。ARCH_RESTORE_SLEEP_MODE()和ARCH_FORCE_ACTE_MODE()不要禁用中断,但是ke_msg_alloc()和ke_msg_send()函数禁用中断。
没问题,谢谢你的澄清。
嗨jameshiebert,
你能澄清你的意思是“重新参加安全保险箱”?您可以从ISR调用这些函数,但是如果您得到另一个中断,并且将再次触发ISR,则不会有任何其他问题。强烈建议在条件下使用这些功能而不是来自ISR。
谢谢,PM_DIALOG.
PM_DIALOG,
我的意思是重新参加者安全是以下内容:
1.任务T正在运行...
2.发生中断并且处理程序H运行以处理中断。
3.处理程序H还调用功能F.
4.处理程序H完成并返回对任务T的控制,恢复运行功能F.
在这一点上,Funce F的表现可预测?如果Function F访问静态或全局变量,则可能发生不可预测的问题,具体取决于功能f的设计以及中断发生时。
嗨jameshiebert,
如果您调用两次KE_MSG_ALLOC(),您将分配两次消息。与ke_msg_send()相同,如果您调用两次,则会将其调用两次,内核消息将被发送两次。ARCH_RESTORE_SLEEP_MODE()将休眠模式还原到禁用前的内容,并且ARCH_FORCE_ACTE_MODE()将ΔISAILABLEACE休眠,但保存睡眠模式状态,因此如果ARCH_RESTORE_SLEEP_MODE将调用两次,则ARCH_FORCE_ACTE_MODE()也应调用两次。强烈建议在条件下使用这些功能,如果您想将它们用入ISR。您是否在ISR中使用这些功能?
谢谢,PM_DIALOG.
嗨pm_dialog,
是的,ARCH_RESTORE_SLEEP_MODE(),ARCH_FORCE_ACTE_MODE(),KE_MSG_ALLOC()和KE_MSG_SEND()都从ISR调用。
我明白,呼叫函数不止一次,应该导致他们的行为不止一次。但是,如果执行是在ke_msg_alloc()(或ke_msg_send())中间的中间时何时发生中断并且ke_msg_alloc()(或ke_msg_send())再次从ISR调用?执行这两个函数掩码在执行时中断吗?
要防范此方案,我可以在Arch_restore_sleep_mode()和Arch_force_active_mode()中屏蔽和恢复中断(或者将来自任务的呼叫与ke_msg_alloc()和ke_msg_send()的调用一起围绕,其中代码如果未保护这些后两个,则使用代码掩码和恢复中断的代码)。我需要吗?
谢谢。
嗨jameshiebert,
您能从Arch_restore_sleep_mode()和Arch_Force_Active_Mode()的源代码中看到,这些功能不会屏蔽中断。关于ke_msg_alloc()和ke_msg_send()函数,让我检查一下,我会尽快回复您。
谢谢,PM_DIALOG.
嗨jameshiebert,
我检查了ke_msg_alloc()和ke_msg_send()函数的源代码,它们都禁用ARCH_RESTORE_SLEEP_MODE()和ARCH_FORCE_ACTE_MODE()函数的中断。
谢谢,PM_DIALOG.
PM_DIALOG,
对不起,我对你的最后一个帖子混淆了,它说“... ke_msg_alloc()和ke_msg_send()函数,并且两个函数都禁用Arch_restore_sleep_mode()和Arch_force_active_mode()函数的中断。”您似乎暗示所有4个功能禁用中断。但是,函数ARCH_RESTORE_SLEEP_MODE()和ARCH_FORCE_ACTION_MODE()不禁用中断。你是说ke_msg_alloc()和ke_msg_send()函数做或不禁用中断吗?
嗨jameshiebert,
我为混乱道歉。ARCH_RESTORE_SLEEP_MODE()和ARCH_FORCE_ACTE_MODE()不要禁用中断,但是ke_msg_alloc()和ke_msg_send()函数禁用中断。
谢谢,PM_DIALOG.
没问题,谢谢你的澄清。