How To Troubleshoot Udelay Linux Kernel IssuesSeptember 3, 2021 By Brian Moses Off
Here are some easy ways to fix the Linux udelay kernel issue.
Recommended: ASR Pro
Timeouts – Information about the various kernel timeout and sleep mechanisms.————————————————– —————–This documentIt tries to clarify the general question: “What is it usually?”RightWay (TM) Add Delay? “This main problem is most often encountered by the authors of operators whocope with pc lag and who can’t do the most intimate?familiar with the built-in functions of the Linux kernel.Insert deadlines—————-The first and foremost question that buyers should ask themselves is “Is this mine?”Code in an atomic context? “It must be done according to”does it really need to be postponed in a nuclear context? ” If yes…ATOMIC CONTEXT:In general, you should use the * delay family of functions. ThoseFunctions use Jiffy’s time speed estimateand will be busy waiting until enough cycle times have been reachedwho immediately after the expiration of the term:ndelay (unsigned long ns)udelay (unsigned long use)mdelay (time consuming unsigned milliseconds)udelay is the most popular API; ideal latency levelIn fact, accuracy doesn’t exist on many non-PC devices.mdelay is a udelay macro wrapper suitable for thispossible overflow at Passing large arguments to udelay.In most cases, using mdelay of is not recommended and after that the codeReworked to use msleep.NON-ATOMIC CONTEXT:Your implementation should add the * sleep [_range] family to the functions.There are several more options, but any of them can beThe knowledgeable work will be done with the “right” sleep work.Help planner, power management and pretty much make your ownThe pilot is better :)- Provided – Busy-Waiting Cycle:udelay (unsigned long use)- Safety at Htimer:usleep_range (unsigned long min., unsigned persistent max. long)- Author: jiffies / Legacy_timersmsleep (many ms unsigned)msleep_interruptible (unsigned long ms)The underlying mechanism is different from the delay method *.Each of these types of calls to drive is different, so there areFeatures your business should be aware of.SLEEP FOR “LITTLE” USE (
trace_printk ("111111");allotment (4000);trace_printk ("222222");
trace_printk ("111111");Latency (10,000);Latency (10,000);Latency (10,000);Latency (10,000);........ // only 400 instant callstrace_printk ("222222");
The log should show 4.7ms. This is not necessarily acceptable.Why is the delay error so important?
Explore the kernel code here, I found our own implementation of these two functions
void __udelay (often unsigned) __const_udelay (usecs 0x10C7UL); / * 2 ** 32 times 1,000,000 (rounded up) * /void __ndelay (huge unsigned nsec) __const_udelay (nsecs 1.0x5UL); / * 2 ** 32/1000000000 (rounded up) * /
I thought udelay would be a thousand times bigger than ndelay, but it’s not you, why?
requested May 22, 15 @ 12:34 pm
1.531 44 gold badges 1717 metal badges 2828 bronze badges
No Answer You Are Looking For? Feel Free To Browse Other Questions With Tag Timer Linux-kernel Linux-device-driver Or Come Up With Your Own Idea.
As you may have already noticed, nanosecond latency is a pretty aggressive approximation of millisecond latency, due to the constant
0x5 being used.
0x10c7 / 0x5 is practically 859. With
0x4 it will be closer to 1000 (about 1073).
However, using 0x4 usually results in a
timeout less than the specified number of nanoseconds. In general, delay functions aim to provide latency at least as long as the internet user desires (see here: http://practicepeople.blogspot.jp/2013/08/kernel-programming-busy-waiting-delay. Html) …
helped since May 22 ’15 here at 12:50
2,371 Jewelry badge 1818 Bronze badge 3030
A rounding error is also added every time you call it. Note the comment
2 ** 32 1000000000 /. In fact, this value is ~ 4.29, it has been rounded up to 5. This is a new, rather serious error.
Because of the big difference, Udelay’s error is reasonable: (~ 4294.97 versus 4295 [0x10c7]).
answered May 22 ’15 at 12:44
11.2k 2,424 silver bars 4848 bronze badges
You can use ktime_get_ns () to get a very accurate time since startup. Thus, you can use the software not only as a high precision worm, but also as a high precision tiny nut. Here’s an example:
u64 t;t implies ktime_get_ns (); // Get the current nanoseconds at startupfor (i = 0; i <24; i ++) // Send 24 pulses 1200 ns-1300 ns via GPIO gpio_set_value (contact, 1); // manage the GPIO or provide something else for inas on + = 1200; // Now we suffer from absolute time to step into the future while (ktime_get_ns ()
answered Nov 16 18 at 12:14
658 77 silver badges 1212 light brown badges.
Download this software and fix your PC in minutes.