2015-02-26 8 views
10

मैं सी 11 में बूटलोडर लिख रहा हूं। जब बूटलोडर को फर्मवेयर पर नियंत्रण स्थानांतरित करने की आवश्यकता होती है, तो यह एक पूर्वनिर्धारित स्मृति पते पर एक फ़ंक्शन पॉइंटर पढ़ता है और उसे कॉल करता है। कोड इस तरह दिखता है:फ़ंक्शन पॉइंटर के साथ नोरटर्न का उपयोग कैसे करें?

typedef void (FirmwareBootFn)(void); 

typedef struct 
{ 
    uint32_t stackPointer; 
    FirmwareBootFn* programCounter; 
} 
FirmwareBootControl; 

static FirmwareBootControl g_bootControl __attribute__ ((section (".boot_control"))); 

void 
Firmware_boot(void) 
{ 
    setStackPointer(g_bootControl.stackPointer); 
    g_bootControl.programCounter(); 
} 

समारोह Firmware_boot() रिटर्न कभी नहीं, तो यह समझ में बनाया noreturn के रूप में यह घोषणा करने के लिए:

#include <stdnoreturn.h> 

noreturn void 
Firmware_boot(void); 

लेकिन मैं FirmwareBootFnnoreturn के रूप में घोषित करने के लिए और साथ ही बचने की जरूरत है संकलक शिकायत करते हैं कि Firmware_boot() वापस आ सकता है।

मैंने बिना किसी परिणाम के typedef में noreturn के प्रत्येक क्रमपरिवर्तन (संभवतः) की कोशिश की। साथ ही मुझे समझ में आया कि विशेषता typedef में सेट नहीं की जा सकती क्योंकि यह इस प्रकार का हिस्सा नहीं है।

क्या Firmware_boot() को noreturn चेतावनी से परहेज करने के लिए कोई तरीका है (चेतावनी दमन के साथ धोखा देने के बिना अच्छी तरह से :-))?

+0

मुझे अभी जीसीसी के लिए एक कामकाज मिला है: ** __ buildin_unreachable **() का उपयोग कोड के एक विशिष्ट बिंदु को चिह्नित करता है क्योंकि "यह लाइन कभी निष्पादित नहीं की जाएगी" इस प्रकार नोरटर्न संपत्ति प्रदान करती है। इस काम के बावजूद, यह पोर्टेबल नहीं है और संकलक को यह समझने की अनुमति नहीं है कि (कम से कम आईएमओ) g_bootControl.programCounter() वापस नहीं आता है और उचित अनुकूलन लागू नहीं करता है। – MaxP

+1

@MaxP, दोनों छोटे दस्तावेज़ों के प्रलेखन और असेंबलर आउटपुट दोनों संकेत देते हैं कि इसका उपयोग अनुकूलन के लिए किया जाता है। (यदि 'foo' घोषित किया गया है '_Noreturn' और' bar' नहीं है, 'foo();' और 'bar(); __builtin_unreachable();' समकक्ष कोड उत्पन्न करें।) – mafso

+0

यदि आप किसी एक्सटेंशन का उपयोग करने के इच्छुक हैं, एक 'विशेषता' का प्रयोग करें। कृपया मेरा जवाब देखें। –

उत्तर

6

_Noreturn सी 11 में केवल फ़ंक्शन परिभाषाओं या घोषणाओं पर लागू किया जा सकता है। तथ्य यह है कि समारोह वापस नहीं आता है दुर्भाग्य से प्रोटोटाइप का हिस्सा नहीं है।

आप वापस नहीं के रूप में समारोह सूचक चिह्नित करने के लिए एक विस्तार

typedef struct 
{ 
    uint32_t stackPointer; 
    __attribute__((__noreturn__)) FirmwareBootFn* programCounter; 
} 
FirmwareBootControl; 

इस्तेमाल कर सकते हैं जब से तुम जीसीसी है लगता है। दुर्भाग्यवश यद्यपि, यह सुनिश्चित करने का एक तरीका प्रतीत नहीं होता है कि आपके द्वारा असाइन किए गए फ़ंक्शन में वास्तव में उस संपत्ति को सिंटैक्स द्वारा किया गया है, सब कुछ।

संबंधित मुद्दे