Currently I am considering the application of FreeRTOS for a robotics project. The processor of choice would be the ATmega128 which is an 8 bit AVR risc processor. One of the most vital tasks would be keeping track of the odometry. A black/white disc turns on the motor-axle and this movement is registered by a sensor. This can be accomplished in several ways: 1: using hardware-counters and read these in using a port but 8 IO lines is a lot on an MCU like this. 2: Connect the motion-sensor directly to an input. This solution would only take uo two IO lines and is hence more attractive, at least to me. The interval at which the IO lines need to be monitored is almost as high as the kernel tick-rate (500-1000Hz) Writing a task for this seems a bad idea as it would leave no timeslots for other processes to run. Instead, I was considering to run the poll routine as part of the tick-interrupt. Using AVR assembly would consume an extra 20-40 cycles at most. Altough this overhead is incorporated in each tick-cycle, this seems a more viable solution than writing a dedicated task that should run every 10ms or so. My proposed code is below but I am curious to find about other solutions to this challenge. Tips about how and where to add (port.c?) this code to FreeRTOS are most welcome also! ;PD0=odo-left ;PD1-odo-right begin: in r16,PIND mov r17,r16 lds r18,pdstore ;temp byte that contains the previous status of PIND eor r16,r18 bst r16,0 brtc right left: ;maintain a 16bit unsigned counter lds r19,leftcnt00 inc r19 sts leftcnt00,r19 brne right lds r20,leftcnt01 inc r20 sts leftcnt01,r20 right: ;maintain a 16bit unsigned counter bst r16,1 brtc ready lds r19,rightcnt00 inc r19 sts rightcnt00,r19 brne ready lds r20,rightcnt01 inc r20 sts rightcnt01,r20 ready: sts pdstore,r17 rts Regards, emgi
You can add code into the tick interrupt using the tick hook. Set configUSE_IDLE_HOOK to 1 in FreeRTOSConfig.h. Then define a function called vApplicationTickHook() into which you put your code. You might have to define this as an assembly function in your case, or a naked C function that has inline assembly code in it.
Thanks a tonne! Assembly programming is not an issue for me but I am having trouble with the ins & outs of WinAVR GCC and I am pretty new to FreeRTOS as well. I guess that I will find out how to do this sooner or later and learn a lot on the way.
You probably meant: configUSE_TICK_HOOK?
Copyright (C) Amazon Web Services, Inc. or its affiliates. All rights reserved.