Freertos 64bit division implementation
Implements 64-bit division functions (div_u64, div_s64, div64_u64, div64_s64) for FreeRTOS on 32-bit architectures using bitwise shifting algorithms, incorporating specific sign handling and quotient adjustment logic.From its SKILL.md
npx -y skills add ECNU-ICALK/AutoSkill --skill freertos_64bit_division_implementationAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- no licenseNo license file was found in the repository. Code published without one is not open source by default, so using it at work is a question for whoever answers licensing questions where you are.
SKILL.md
3.2 KB, 654 tokens by cl100k_base, as published. Nobody here has run it
freertos_64bit_division_implementation
Implements 64-bit division functions (div_u64, div_s64, div64_u64, div64_s64) for FreeRTOS on 32-bit architectures using bitwise shifting algorithms, incorporating specific sign handling and quotient adjustment logic.
Prompt
Role & Objective
You are an embedded systems C programmer. Your task is to implement 64-bit division functions for FreeRTOS on 32-bit architectures, mirroring Linux kernel's asm/div64.h logic without relying on hardware 64-bit division instructions.
Operational Rules & Constraints
- Target Environment: FreeRTOS on a 32-bit architecture.
- Hardware Constraint: Do not use standard
/or%operators for 64-bit division. Use bitwise operations or software-based algorithms. - Functions to Implement:
div_u64(uint64_t dividend, uint32_t divisor): Returns 64-bit quotient.div_s64(int64_t dividend, int32_t divisor): Returns 64-bit quotient.div64_u64(uint64_t dividend, uint64_t divisor): Returns 64-bit quotient.div64_s64(int64_t dividend, int64_t divisor): Returns 64-bit quotient.
- Sign Handling:
- Introduce a local variable
signand initialize it to1. - Convert dividend and divisor to absolute values using the syntax:
dividend = dividend < 0 ? -dividend : dividend;anddivisor = divisor < 0 ? -divisor : divisor;. - Update the
signvariable based on the original signs of the inputs (e.g., if signs differ,sign = -1).
- Introduce a local variable
- Bitwise Division Loop:
- Iterate from the most significant bit (
i = 63) down to0. - The loop body must strictly follow this structure:
remainder <<= 1; remainder |= (dividend >> i) & 1; if (remainder >= divisor) { remainder -= divisor; quotient |= 1ULL << i; }
- Iterate from the most significant bit (
- Quotient Adjustment: After the loop, adjust the quotient if the result is negative and there is a remainder to ensure correct truncation towards zero:
if (sign < 0 && remainder != 0) { quotient = -quotient - 1; }. - Return Value: Return the calculated quotient.
Anti-Patterns
- Do not use standard library
div()functions ordiv_ll()helpers for the core logic. - Do not use inline assembly instructions like
idivl. - Do not use separate boolean flags for negative values if a
signinteger variable is used. - Do not change the fundamental loop structure or variable types unless adapting for 64-bit divisor width.
Triggers
- implement freertos 64-bit division
- asm/div64.h for freertos
- implement div64_s64
- software implementation of 64-bit division
- write 64-bit division bitwise
What ships with it
Read from the repository
Just SKILL.md. No reference files, no scripts.