你好,对话框,
是DA14581/SDK 5.0的内核和SDK调用。X重入安全(例如ke_msg_alloc(), ke_msg_send(), arch_restore_sleep_mode(), arch_force_active_mode())?我们从ISR和应用程序任务中进行这些调用。
有哪些电话是我们绝对不能从ISR打来的吗?
谢谢!
嗨JamesHiebert,
你能解释一下"可返回安全"是什么意思吗?你可以从一个ISR调用这些函数,但是你不能完全确定如果你得到另一个中断并且ISR将被再次触发,你将不会有任何其他问题。强烈建议在条件下使用这些功能,而不是从ISR。
谢谢,PM_Dialog
PM_Dialog,
我所说的可重入安全是这样的:1.任务T运行函数F时,…2.一个中断发生,处理程序H运行来处理这个中断。3.处理器H也调用函数F。4.处理程序H完成并将控制返回给任务T,任务T继续运行函数F。
在这一点上,函数F的行为是可预测的吗?如果函数F访问静态或全局变量,可能会发生不可预知的问题,这取决于函数F的设计和中断发生的时间。
如果两次调用ke_msg_alloc(),则将分配两次消息。ke_msg_send()也会发生同样的情况,如果调用两次,内核消息将发送两次。arch_restore_sleep_mode()恢复睡眠模式之前禁用和arch_force_active_mode()将δisable睡但拯救睡眠模式状态,所以如果arch_restore_sleep_mode被称为两次,也arch_force_active_mode()应该被称为两次。如果您想在ISR中使用这些功能,强烈建议您在特定条件下使用这些功能。你在ISR中使用这些功能吗?
嗨PM_Dialog,
是的,arch_restore_sleep_mode()、arch_force_active_mode()、ke_msg_alloc()和ke_msg_send()都是从isr调用的。
我理解不止一次地调用函数应该导致它们的行为不止一次地发生。但是,如果在中断发生时,执行在ke_msg_alloc()(或ke_msg_send())中间,并且从ISR再次调用ke_msg_alloc()(或ke_msg_send()),该怎么办?这两个函数在执行时屏蔽中断吗?
为了防止出现这种情况,我可以屏蔽和恢复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_active_mode()函数的中断。
抱歉,我对你的上一篇文章说“…ke_msg_alloc()和ke_msg_send()函数,它们都禁用中断arch_restore_sleep_mode()和arch_force_active_mode()函数”感到困惑。您似乎在暗示所有4个功能都禁用中断。但是,函数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()函数禁用中断。
没问题,谢谢你的澄清。
嗨JamesHiebert,
你能解释一下"可返回安全"是什么意思吗?你可以从一个ISR调用这些函数,但是你不能完全确定如果你得到另一个中断并且ISR将被再次触发,你将不会有任何其他问题。强烈建议在条件下使用这些功能,而不是从ISR。
谢谢,PM_Dialog
PM_Dialog,
我所说的可重入安全是这样的:
1.任务T运行函数F时,…
2.一个中断发生,处理程序H运行来处理这个中断。
3.处理器H也调用函数F。
4.处理程序H完成并将控制返回给任务T,任务T继续运行函数F。
在这一点上,函数F的行为是可预测的吗?如果函数F访问静态或全局变量,可能会发生不可预知的问题,这取决于函数F的设计和中断发生的时间。
嗨JamesHiebert,
如果两次调用ke_msg_alloc(),则将分配两次消息。ke_msg_send()也会发生同样的情况,如果调用两次,内核消息将发送两次。arch_restore_sleep_mode()恢复睡眠模式之前禁用和arch_force_active_mode()将δisable睡但拯救睡眠模式状态,所以如果arch_restore_sleep_mode被称为两次,也arch_force_active_mode()应该被称为两次。如果您想在ISR中使用这些功能,强烈建议您在特定条件下使用这些功能。你在ISR中使用这些功能吗?
谢谢,PM_Dialog
嗨PM_Dialog,
是的,arch_restore_sleep_mode()、arch_force_active_mode()、ke_msg_alloc()和ke_msg_send()都是从isr调用的。
我理解不止一次地调用函数应该导致它们的行为不止一次地发生。但是,如果在中断发生时,执行在ke_msg_alloc()(或ke_msg_send())中间,并且从ISR再次调用ke_msg_alloc()(或ke_msg_send()),该怎么办?这两个函数在执行时屏蔽中断吗?
为了防止出现这种情况,我可以屏蔽和恢复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_active_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_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
没问题,谢谢你的澄清。