| Deutsch English Français Italiano |
|
<vs2s9r$3kqov$2@dont-email.me> View for Bookmarking (what is this?) Look up another Usenet article |
Path: ...!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!eternal-september.org!.POSTED!not-for-mail From: The Natural Philosopher <tnp@invalid.invalid> Newsgroups: comp.sys.raspberry-pi Subject: Re: Fscking Pointers. Date: Thu, 27 Mar 2025 06:47:23 +0000 Organization: A little, after lunch Lines: 99 Message-ID: <vs2s9r$3kqov$2@dont-email.me> References: <vs1jgs$2co6s$3@dont-email.me> <m4j56iF31mcU1@mid.individual.net> <auh*Pis+z@news.chiark.greenend.org.uk> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Injection-Date: Thu, 27 Mar 2025 07:47:23 +0100 (CET) Injection-Info: dont-email.me; posting-host="05d7e3be59ea89065d57852c75c92217"; logging-data="3828511"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX1+U0Vfoxso2+8QJbcePKfGNWIkbnPg74LA=" User-Agent: Mozilla Thunderbird Cancel-Lock: sha1:Vf4+vQ7P++WMlR8OTlYgCCRa/gU= In-Reply-To: <auh*Pis+z@news.chiark.greenend.org.uk> Content-Language: en-GB Bytes: 4704 On 26/03/2025 23:07, Theo wrote: > Andy Burns <usenet@andyburns.uk> wrote: >> The Natural Philosopher wrote: >> >>> It seems C has caught the disease of 'we will modify your code according >>> to what WE think it means'.. >>> >>> ..my pointers to 254 byte structures are going haywire when I add 256 >>> bytes to them...I have to add one instead... >> >> if C knows the thing being pointed to is a 254 byte struct, then adding >> 256 to it will move it by 65024 bytes surely? >> >> >> adding 1, will move it by 254 bytes. > > When you point to an object of type X, incrementing that pointer is in > increments of the in-memory size of X, plus rounding. ie you might have a > 254 byte structure but your compiler may decide to lay those out at it's > convenience. It could be that it pads the size to 256 bytes to avoid > unaligned accesses which your architecture may not support. To avoid that, > declare the struct as packed (which is a compiler specific directive), which > would save memory but could force it to break operations into aligned > accesses (eg an unaligned 32 bit load might turn into two aligned loads plus > some AND/OR/shift logic) > >>> ..add that to the fact that to write to flash RAM you need to specify >>> the *offset* from flash RAM base, but to read it you need to use the >>> actual hardware address... >> >> are you casting pointers? > > I suspect the flash is mapped as readable at some base address, but to write > you need to issue a write command. ie to read you can just do: > > int data = *(FLASH_READ_BASE + flash_offset); > > but writing might be something like: > > *(FLASH_WRITE_ADDR) = flash_offset; > *(FLASH_WRITE_DATA) = 0x12345678; > *(FLASH_WRITE_GO) = true; > Essentially yes. There are no functions to read flash, but to write and to erase are discrete functions taking offset, not absolute addresses >>> What is the generic type for a simple pointer to presumably bytes, in >>> ARM C? >> >> traditionally char* > > Slightly less traditionally (C99 and later): > #include <stdint.h> > > and then you have the type uint8_t* as a pointer to unsigned 8 bit ints, and > int8_t* pointing to signed 8 bit ints. > Thanks for that. I think for readability that is preferable to char * as there is a hint of 'this is a string' about that. uint8_t* means 'a pointer that increments by one for each byte' >>> Or should I resign myself to doing everything in 256byte chunks? the >>> structure to be read and written from Flash is exactly that big for >>> obvious hardware reasons... > > I don't know the flash type or block size (this is a Pico?) but if you write > chunks you're likely to cause fewer erase cycles than writing random bytes > here and there. It's going to cause less wear to round to 256 then have > things unaligned and span block boundaries. > You CAN only write chunks of 256 bytes and erasure is a whole 4k block. > Theo Thanks for that. Having slept on it I think that I will go for 'the closest to assembler' and use uint8_t * except where accessing the structure contents. Then I can explicitly cast it to a structure pointer. I had forgotten about packing arrays too. Pico is a 32 bit chip. No idea how wide its data bus is - ah that's 32 bits as well. So I guess byte accesses are 32 bit access with the answer shifted right ... Rethink needed there as well Thanks for all the hints -- “The ultimate result of shielding men from the effects of folly is to fill the world with fools.” Herbert Spencer