Keil의 CMSIS-RTOS Tutorial을 팔로우 중입니다.osKernalSysTick()의 랩 어라운드가 필요합니까?
섹션 : 이것은 서브 - 밀리 세컨드의 지연을 넣어 이하의 방법을 제공하는 서브 밀리는
osKernelSysTick (int32_t tick,delayPeriod; tick = osKernelSysTick(); // get start value of the Kernel system tick // Then we can scale a period in microseconds to a SysTick count value delayPeriod = osKernelTickMicroSec(100)); // This then allows us to create a delay for the the required period. do { // Delay for 100 microseconds } while ((osKernelSysTick() - tick) < delayPeriod);
)는 롤링 32 비트 카운터의 값을 반환 지연; 이 구현은 그 값의 랩 어라운드를 제공하지 않습니다.
랩 어라운드가 발생하면 의도 한 지연이 발생하지 않습니다. Keil의 공식 문서에 버그가 있습니까? 아니면 뭔가 빠졌습니까?
_ "이 구현은 그 값의 랩 어라운드에 맞지 않습니다."_ 확실합니까? 2의 보수 산술을 염두에두고 랩 어라운드 케이스의 수학을 연습 해보십시오. – Notlikethat
@Muhammad - 문제를 복잡하게 만들려면 옵티마이 저가 최적화를 수행하고 위에서 정의되지 않은 동작을 제거하는 것에 대해 걱정해야합니다. 'uint32_t '를 사용하면 많은 문제를 피할 수있었습니다. 또한 [Signed Overflow]에 대한 Ian Lance Taylor의 블로그 (http://www.airs.com/blog/archives/120)를 참조하십시오. 그리고 * signed integer overflow *는 정의되지 않은 동작이지만 * unsigned integer wrap *은 잘 정의 된 동작입니다. – jww
함수 프로토 타입은'uint32_t osKernelSysTick (void)'입니다. 부호없는 값을 반환합니다. 변수'ticks '유형을 변경해야합니다. – Gerhard