मैं सी 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);
लेकिन मैं FirmwareBootFn
noreturn
के रूप में घोषित करने के लिए और साथ ही बचने की जरूरत है संकलक शिकायत करते हैं कि Firmware_boot()
वापस आ सकता है।
मैंने बिना किसी परिणाम के typedef
में noreturn
के प्रत्येक क्रमपरिवर्तन (संभवतः) की कोशिश की। साथ ही मुझे समझ में आया कि विशेषता typedef
में सेट नहीं की जा सकती क्योंकि यह इस प्रकार का हिस्सा नहीं है।
क्या Firmware_boot()
को noreturn
चेतावनी से परहेज करने के लिए कोई तरीका है (चेतावनी दमन के साथ धोखा देने के बिना अच्छी तरह से :-))?
मुझे अभी जीसीसी के लिए एक कामकाज मिला है: ** __ buildin_unreachable **() का उपयोग कोड के एक विशिष्ट बिंदु को चिह्नित करता है क्योंकि "यह लाइन कभी निष्पादित नहीं की जाएगी" इस प्रकार नोरटर्न संपत्ति प्रदान करती है। इस काम के बावजूद, यह पोर्टेबल नहीं है और संकलक को यह समझने की अनुमति नहीं है कि (कम से कम आईएमओ) g_bootControl.programCounter() वापस नहीं आता है और उचित अनुकूलन लागू नहीं करता है। – MaxP
@MaxP, दोनों छोटे दस्तावेज़ों के प्रलेखन और असेंबलर आउटपुट दोनों संकेत देते हैं कि इसका उपयोग अनुकूलन के लिए किया जाता है। (यदि 'foo' घोषित किया गया है '_Noreturn' और' bar' नहीं है, 'foo();' और 'bar(); __builtin_unreachable();' समकक्ष कोड उत्पन्न करें।) – mafso
यदि आप किसी एक्सटेंशन का उपयोग करने के इच्छुक हैं, एक 'विशेषता' का प्रयोग करें। कृपया मेरा जवाब देखें। –