मैं TriCore से ARM कॉर्टेक्स (थंब -2 निर्देश सेट) से एक छोटा अकादमिक ओएस पोर्ट कर रहा हूं। शेड्यूलर को काम करने के लिए, मुझे कभी-कभी स्टैक को संशोधित किए बिना और लिंक रजिस्टर के बिना सीधे किसी अन्य फ़ंक्शन पर जंप की आवश्यकता होती है।सीधे किसी अन्य सी ++ फ़ंक्शन पर जाएं
Tricore पर (या, बल्कि, Tricore-जी ++ पर), इस आवरण टेम्पलेट (किसी भी तीन तर्क-समारोह के लिए) काम करता है:
template< class A1, class A2, class A3 >
inline void __attribute__((always_inline))
JUMP3(void (*func)(A1, A2, A3), A1 a1, A2 a2, A3 a3) {
typedef void (* __attribute__((interrupt_handler)) Jump3)(A1, A2, A3);
((Jump3)func)(a1, a2, a3);
}
//example for using the template:
JUMP3(superDispatch, this, me, next);
यह कोडांतरक अनुदेश J
(उर्फ जम्प) उत्पन्न होगा बजाय CALL
का, स्टैक और सीएसए को अपरिवर्तित छोड़कर (अन्यथा सामान्य) C++ फ़ंक्शन superDispatch(SchedulerImplementation* obj, Task::Id from, Task::Id to)
पर अपरिवर्तित छोड़ दिया गया।
अब मैं एआरएम कॉर्टेक्स पर एक समान व्यवहार की जरूरत है (या, बल्कि, हाथ-नन-linux-gnueabi-जी ++ के लिए), यानी एक B
(उर्फ शाखा) (लिंक और आदान प्रदान के साथ शाखा उर्फ) BLX
के बजाय अनुदेश उत्पन्न । लेकिन arm-g ++ के लिए interrupt_handler
विशेषता नहीं है और मुझे कोई समकक्ष विशेषता नहीं मिली।
तो मैं asm volatile
का सहारा और एएसएम कोड सीधे लिख करने की कोशिश की:
template< class A1, class A2, class A3 >
inline void __attribute__((always_inline))
JUMP3(void (*func)(A1, A2, A3), A1 a1, A2 a2, A3 a3) {
asm volatile (
"mov.w r0, %1;"
"mov.w r1, %2;"
"mov.w r2, %3;"
"b %0;"
:
: "r"(func), "r"(a1), "r"(a2), "r"(a3)
: "r0", "r1", "r2"
);
}
अब तक तो अच्छा है, मेरे सिद्धांत रूप में, कम से कम। थंब -2 को रजिस्टरों में पारित होने के लिए फ़ंक्शन तर्कों की आवश्यकता होती है, यानी इस मामले में r0..r2, इसलिए इसे काम करना चाहिए।
लेकिन तब लिंकर
undefined reference to `r6'
एएसएम बयान के समापन ब्रैकेट पर
साथ मर जाता है ... और मैं क्या इसके बारे में बनाने के लिए पता नहीं है। ठीक है, मैं सी ++ में विशेषज्ञ नहीं हूं, और एएसएम सिंटैक्स बहुत सीधा नहीं है ... तो क्या किसी को मेरे लिए इशारा मिला है? Arm-g ++ के लिए सही __attribute__
पर एक संकेत एक तरीका होगा, एएसएम कोड को ठीक करने का संकेत एक और होगा। एक और तरीका शायद संकलक को बताना होगा कि a1..a3
रजिस्ट्रार r0..r2
में पहले से ही होना चाहिए जब एएसएम कथन दर्ज किया गया है (मैंने उसमें थोड़ा सा देखा, लेकिन कोई संकेत नहीं मिला)।
क्या ए 1, ए 2, ए 3 पॉइंटर्स हैं? उन्हें '(शून्य *) ' – osgx
में परिवर्तित करने का प्रयास करें एआरएम इंटरप्ट हैंडलर के लिए विशेषता' इंटरप्ट 'है। Http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html –
@ माइक: नहीं, वह विशेषता अभी भी 'BLX' निर्देश उत्पन्न करती है ... – orithena