Hi every body, I am in a bit trouble of finding out the processing time taken by main_tcpnet() function. As it is written in documents that this function must be called periodically but does not specify at how much rate i.e milliseconds. Secondaly since i have other work to do also during interrupt (timer) i wonder how to fix main_tcpnet() function in the same interrupt as doing this causes my hardware to reset. Plz help me Thanx in advance
Are you sure it is a good idea to call an unknown function from an ISR? How will you make sure that all other uses of the TCP functionality isn't affected by reentrancy problems?
If you do not know how long the worst-case call to the function takes, how will you then be able to figure out the effect on your interrupt handler, or on the rest of the interrupt system?
I agree with Per. I don't think this should be called from an ISR. There are definite re-entrance problems here. Plus, you might be overflowing your ISR stack.
Surely it would be better to call the function from a task; just like the example(s) given by Keil.
I don't see the need to consider calling it from an ISR.
Thakyou all for reply,
First of all i would say that i m not using RTX kernel, and since calling it from main while(1) making a non periodic call, i am calling it from ISR. And don't worry i am using a timer interrupt of 10msec and even after not doing any thing in ISR except calling main_tcpnet(), my board is getting reset sometime, Thus obviously my que is can any body tell me what is the function of main_tcpnet(), How much time will it take to execute, and on factors does it depends,
Also plz tell me can i do tcpip without using main_tcpnet
aren't there better ways to achieve what you are trying to do? for example, polling a free running hardware timer in your main() 'while' loop and calling 'main_tcpnet()' regularly? or having the hardware timer interrupt the core, set a flag in the timer ISR and polling that one in 'main'? What you are doing is wrong, and probably the cause for your misery.
Quite a number of embedded stacks are intended to be used either in a RTOS thread, or as one of many actions to perform in a while (1) loop.
Hi Michal
What u r saying is the same thing i m doing. Please try to understand following scenario
1) you have set a timer interrupt of say x milli sec 2) after x milli sec you have set a flag in ISR 3) in while(1) u are doing other stuff and say after y milli seconds you poll the flag and called main_tcpnet().
in the above situation first of all ur call to main_tcpnet is not periodic and if y > x main_tcpnet will not work or becomes vey slow.
Dear Devendra,
the uVision help contains many of the answers you are looking for. It is just that it is not so easy to find them.
Reading the help, I can tell that the only function that should be called from an ISR is the timer_tick(), used to give TCPnet an exact indication of time spent.
The main_TcpNet() function should be called very frequently but I personally would not call it from an ISR. The uVision help always shows it running inside a forever loop.
If you want to call it regularly every 10 ms, you can do that also in the forever loop of main() by following the code I attach at the end of my post.
For what regards what TCPnet does, .... the internals of TCPnet is known only by Keil and only recently also by those who purchased the source code of TCPnet.
However, it is possible to understand a lot by simply reading the uVision help.
I give you an example.
If you read the section related to tcp_get_socket, it is written that to run a simple passive socket application the following steps are needed.
It is important to write your own listener() function to do what you want, because main_TcpNet() calls it when one internal event is generated. The listener() function is the way TCPnet allows you to customise operations upon reception of request of connections from a remote client, upon reception of a a valid TCP packet etc.
To make an example, you can customise your listener() function so that your device rejects an attemp of a client to communicate by simply returning 0 upon reception of the TCP_EVT_CONREQ event.
That is only one example of something that main_TcpNet() does. But it is not the only thing.
In general, main_TcpNet() handles the execution of both high level operations (i.e., to send/receive packets, etc...) and also of low level operations (interaction with Ethernet device driver for instance).
You can understand many more behaviours of TCPnet just using your JTAG and placing some breakpoints in your listener() function.
I hope that it can help you to run your first TCPnet application.
Good luck,
Marco.
// this is an extract of code to run on a cortex m3 the function main_TcpNet() every 10ms // stores up to 32 event flags volatile uint32_t event_mask = 0x00000000; const uint32_t eventflag_tcpnet = 0x00000001; int main(void) { for(;;) { // do things..... dothings(); // keep on checking if the systick sends a new event to run main_TcpNet() if(eventflag_tcpnet == (events_mask & eventflag_tcpnet)) { // 1. erase the event. in here you must protect events_mask against // systick interrupt __disable_irq(); events_mask = events_mask & (~eventflag_tcpnet); __enable_irq(); // 2. call tcpnet main_TcpNet(); } // do more things..... domorethings(); } // this isr is called every 1 ms void SysTick_Handler(void) { static uint32_t msec = 0; msec++; if(0 == (msec/10)) { // set the tcpnet event flag event_mask |= eventflag_tcpnet; } if(0 == (msec/100)) // use 100 if TICK_INTERVAL in net_config.c is 100 msec. { timer_tick(); } }
Hello all,
in re-writing the example from some working C code of mine I mistyped a % in SysTick_Handler(). See errata corrige below.
Also, I missed the closing } of the for(;;).
Regards, Marco.
// errata: if(0 == (msec/10)) if(0 == (msec%10)) // corrige ..... ..... // errata: if(0 == (msec/100)) if(0 == (msec%100)) // corrige
Hi Macro
Yes i understood what u have written, But my while loop is too big such that the time i will check the flag may vary from 10ms to 500ms depending upon certain conditions. Certainly with this much delay it will not work.
Secondly help me regarding following:
i programmed MAC to accept only Perfect match address by disabling broadcast. This removes the burden of unwanted interrupts and this works fine. But as soon as i removed the ethernet cable "time out" occurs during ping but when reattached cable still "time out" occurs. And this situations never ends untill i reenable broadcast and dump it into target Plz tell me how to disable broadcast in this situation
it sounds like you have a program design issue at hand. maybe it is better to re-design it, or use an RTOS - that's what they are for, after all:managing priorities and timely servicing different parts of a program.
"...or use an RTOS..."
That would surely be the best option.
You might want to consider/investigate LightingBolt ;)
hi devendra,
if your forever loop takes that time you should seriously consider either to make it shorter by defragmenting actions in more than one iteration or to use an rtos to execute things in parallel.
with an rtos you can make a task with higher priority which regularly wakes up and calls your tcp functions.
About the second problem you have, unfortunately I cannot help much because I havent ever used that feature.
what you should do is to investigate more and post a new question with more details.
good luck, marco.
If the board never responds to broadcasts, how do you find the board when a PC makes a broadcast ARP request to find out which MAC address to use to communicate with ip x.y.z.w?
Hello per
You are right ARP will not work at all if broadcast is disabled, But if this is the case why NXP has given filter feature if it is of no use in such situations