你好Dialog,
DA14581/SDK 5.0.X重入程序的内核和SDK调用是否安全(例如,ke_msg_alloc()、ke_msg_send()、arch_restore_sleep_mode()、arch_force_active_mode())?我们确实从ISR和应用程序任务中进行了这些调用。
有什么我们绝对不应该从ISR打来的电话吗?
谢谢!
嗨,杰米谢伯特,
你能澄清一下“安全再入境”是什么意思吗?您可以从ISR调用这些函数,但是您不能完全确定如果您得到另一个中断并且ISR将再次触发,您将不会有任何其他问题。强烈建议在特定条件下使用这些功能,而不是从ISR使用。
谢谢,下午好
PM\U对话框,
我所说的重新进入安全是指:1任务T正在运行函数F,当。。。2中断发生,处理程序H运行以处理中断。三。处理程序H也调用函数F。4处理程序H完成并将控制权返回给任务T,任务T继续运行函数F。
在这一点上,函数F的行为是否可以预测?如果函数F访问静态或全局变量,则可能会出现不可预知的问题,具体取决于函数F的设计和中断发生的时间。
如果调用两次ke\u msg\u alloc(),则会分配两次消息。同样的情况也会发生在ke\u msg\u send()上,如果调用它两次,内核消息将被发送两次。arch\u restore\u sleep\u mode()将睡眠模式恢复到禁用前的状态,arch\u force\u active\u mode()将δ禁用睡眠,但保存睡眠模式状态,因此如果要调用两次arch\u restore\u sleep\u mode(),也应该调用两次arch\u force\u active\u mode()。如果您想在ISR中使用这些功能,强烈建议您在特定条件下使用这些功能。您是否在ISR中使用这些功能?
嗨,PM\U对话,
是的,arch\u restore\u sleep\u mode()、arch\u force\u active\u mode()、ke\u msg\u alloc()和ke\u msg\u send()都是从ISRs调用的。
我知道多次调用函数会导致它们的行为发生多次。但是如果在中断发生时,执行处于ke\u msg\u alloc()(或ke\u msg\u send())的中间,并且从ISR再次调用ke\u msg\u alloc()(或ke\u msg\u send()),该怎么办?这两个函数是否在执行时屏蔽中断?
为了防止出现这种情况,我可以在arch\u restore\u sleep\u mode()和arch\u force\u active\u mode()中屏蔽和恢复中断(或者用代码将来自对ke\u msg\u alloc()和ke\u msg\u send()的任务的调用包围起来,如果后两个不受保护的话,这些代码会屏蔽和恢复中断)。我需要吗?
谢谢。
从arch\u restore\u sleep\u mode()和arch\u force\u active\u mode()的源代码中可以看到,这些函数不会屏蔽中断。关于keu msg\u alloc()和keu msg\u send()函数,让我检查一下,我会尽快给你回复。
我检查了ke\u msg\u alloc()和ke\u msg\u send()函数的源代码,它们都禁用了arch\u restore\u sleep\u mode()和arch\u force\u active\u mode()函数的中断。
抱歉,我被你上一篇帖子搞糊涂了,上面说“…ke\u msg\u alloc()和ke\u msg\u send()函数,它们都禁用了中断作为arch\u restore\u sleep\u mode()和arch\u force\u active\u mode()函数。”你似乎暗示这4个函数都禁用了中断。但是,函数arch\u restore\u sleep\u mode()和arch\u force\u active\u mode()不会禁用中断。你是说ke\u msg\u alloc()和ke\u msg\u send()函数是否禁用中断?
很抱歉给你添麻烦。arch\u restore\u sleep\u mode()和arch\u force\u active\u mode()不禁用中断,但是ke\u msg\u alloc()和ke\u msg\u send()函数使残废中断。
没问题,谢谢你澄清。
嗨,杰米谢伯特,
你能澄清一下“安全再入境”是什么意思吗?您可以从ISR调用这些函数,但是您不能完全确定如果您得到另一个中断并且ISR将再次触发,您将不会有任何其他问题。强烈建议在特定条件下使用这些功能,而不是从ISR使用。
谢谢,下午好
PM\U对话框,
我所说的重新进入安全是指:
1任务T正在运行函数F,当。。。
2中断发生,处理程序H运行以处理中断。
三。处理程序H也调用函数F。
4处理程序H完成并将控制权返回给任务T,任务T继续运行函数F。
在这一点上,函数F的行为是否可以预测?如果函数F访问静态或全局变量,则可能会出现不可预知的问题,具体取决于函数F的设计和中断发生的时间。
嗨,杰米谢伯特,
如果调用两次ke\u msg\u alloc(),则会分配两次消息。同样的情况也会发生在ke\u msg\u send()上,如果调用它两次,内核消息将被发送两次。arch\u restore\u sleep\u mode()将睡眠模式恢复到禁用前的状态,arch\u force\u active\u mode()将δ禁用睡眠,但保存睡眠模式状态,因此如果要调用两次arch\u restore\u sleep\u mode(),也应该调用两次arch\u force\u active\u mode()。如果您想在ISR中使用这些功能,强烈建议您在特定条件下使用这些功能。您是否在ISR中使用这些功能?
谢谢,下午好
嗨,PM\U对话,
是的,arch\u restore\u sleep\u mode()、arch\u force\u active\u mode()、ke\u msg\u alloc()和ke\u msg\u send()都是从ISRs调用的。
我知道多次调用函数会导致它们的行为发生多次。但是如果在中断发生时,执行处于ke\u msg\u alloc()(或ke\u msg\u send())的中间,并且从ISR再次调用ke\u msg\u alloc()(或ke\u msg\u send()),该怎么办?这两个函数是否在执行时屏蔽中断?
为了防止出现这种情况,我可以在arch\u restore\u sleep\u mode()和arch\u force\u active\u mode()中屏蔽和恢复中断(或者用代码将来自对ke\u msg\u alloc()和ke\u msg\u send()的任务的调用包围起来,如果后两个不受保护的话,这些代码会屏蔽和恢复中断)。我需要吗?
谢谢。
嗨,杰米谢伯特,
从arch\u restore\u sleep\u mode()和arch\u force\u active\u mode()的源代码中可以看到,这些函数不会屏蔽中断。关于keu msg\u alloc()和keu msg\u send()函数,让我检查一下,我会尽快给你回复。
谢谢,下午好
嗨,杰米谢伯特,
我检查了ke\u msg\u alloc()和ke\u msg\u send()函数的源代码,它们都禁用了arch\u restore\u sleep\u mode()和arch\u force\u active\u mode()函数的中断。
谢谢,下午好
PM\U对话框,
抱歉,我被你上一篇帖子搞糊涂了,上面说“…ke\u msg\u alloc()和ke\u msg\u send()函数,它们都禁用了中断作为arch\u restore\u sleep\u mode()和arch\u force\u active\u mode()函数。”你似乎暗示这4个函数都禁用了中断。但是,函数arch\u restore\u sleep\u mode()和arch\u force\u active\u mode()不会禁用中断。你是说ke\u msg\u alloc()和ke\u msg\u send()函数是否禁用中断?
嗨,杰米谢伯特,
很抱歉给你添麻烦。arch\u restore\u sleep\u mode()和arch\u force\u active\u mode()不禁用中断,但是ke\u msg\u alloc()和ke\u msg\u send()函数使残废中断。
谢谢,下午好
没问题,谢谢你澄清。