嵌入式开发者社区

标题: OMAPL138的内存映射是否在Linux下已经完成??? [打印本页]

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 , R7 b2 w0 o1 A+ s$ T, @' Q
0 k' R/ z! n2 N( |, U
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
% ]: X( Z1 f: d, {# x1 @6 p#include <unistd.h>: ^8 ^9 X3 F( \8 r$ a
#include <sys/mman.h>& x/ R9 F: N% j/ |6 Z" u# s
#include <sys/types.h>8 C1 c0 r8 R% W: x0 a
#include <fcntl.h>  z! C. m  ]; k, w! W) E& m
9 ]7 E+ B$ q- O$ I  n$ A* u6 ~
#define SHAER_RAM_BASE_ADDR    (0x80000000)   + p& E" N" h# Y1 d* l
. Y, ^& a$ e5 y+ h( h1 d  l* z3 k
typedef struct
$ z! i, V0 r! \0 V, `9 v3 e7 {{5 x9 n  L/ P* X! S( Z! E5 u
        unsigned int a;
4 `* j2 U" h% z' f* I; {' c        unsigned int b;
2 D# D5 E$ r: S' _        unsigned int packet_cout;
% p- W8 }# g) N7 B}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;; H  [) T8 N3 O+ x: A

' O1 l. m- C5 H$ }/ I7 `: Ivoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);3 M; r( Z  M% m3 j7 K. y
unsigned int count_copy = 0;
% u! [* O0 A+ j/ L  \
! s0 R  L$ k- ]* N
& c* u" Q$ {6 l# Gint main()
( |5 |% C* A7 B6 F4 w& E0 \{0 @  A, M" L+ z% i% x: U) F& R
        pRX_MSG_PROTOCOL pshreRAM = NULL;% m4 p: b" Z2 w2 `) P/ Y
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;+ M2 r% w, q( W" t3 n  a" z
7 m$ V8 l  a3 T5 ]% p
        while(1)
9 U6 i- J: J% `1 ]3 ]* H! X        {
5 Z' O: N# f- e5 R5 @: K# X/ X                read_MSG_buffer(pshreRAM);% W7 q& e! l" C' n$ O5 q
        }               
& ^4 Z0 t- p( w8 E- Q}
8 l+ F2 w; b  T( @/ D3 b) w5 u: ]9 i+ K; T' ~$ L0 ]# ~
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)5 Z" {8 P4 ~4 L1 @7 r
{4 Q' R0 `9 Q  g. q7 [& V; _
        RX_MSG_PROTOCOL buf;6 k* T! b1 s1 p. }  Z% Z2 S( U( m
        
( q% s4 t. P. \5 k( B' r        buf.a = pshreRAM->a;
+ I. r4 H" }; o7 O$ A        buf.b = pshreRAM->b;1 r2 f3 R4 x1 ~" ^
        buf.packet_cout = pshreRAM->packet_cout;: M1 n$ r& C+ C: V- U
        
, ]" n# d4 ]+ ~6 J  k- }        if(buf.packet_cout != count_copy)+ D0 U; |0 z4 R; j. F5 N
        {; M( U( M+ d0 G: C4 J) k
                printf("a is %d\n", buf.a);& l* w' {3 v. w
                printf("b is %d\n", buf.b);
0 k: y( R% d2 h- i! [6 Q0 k+ u7 v                printf("count is %d\n", buf.packet_cout);
& E( D" q$ r& A! Z+ D& n9 V                count_copy = buf.packet_cout;; W! ~5 _% M: X0 K& K/ X
        }6 h# l$ g, ?/ y) y
        else
" D; K% u; S5 z        {5 l; j+ f7 {5 N) o- {5 L; q! d' A& r
                printf("No effective message!");
, v1 M% w$ J$ Y2 \        }
  H( x/ b# L6 T* w}# V' @# i$ _5 e7 y) o0 Z% \

6 H& J' |3 V# s' O" `) F& M5 w7 d$ H; [6 M  i4 n( Y
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。! p3 d# U1 M4 g
使用下面代码,对内存使用了mmap函数后:# |% |9 e8 R7 B4 ~! J% i" b( t* G
#include <stdio.h>
5 Z; V0 a6 K( T: p! o#include <unistd.h>
3 S% T8 [* @7 j7 j; S#include <sys/mman.h>, ]' }/ \+ i, ~/ p, f& l( }' v! A
#include <sys/types.h>
3 U  P* k( T2 l' T' u/ V#include <fcntl.h>4 l( A2 O0 r8 T
) l8 U5 h. E4 s0 A
#define SHAER_RAM_BASE_ADDR    (0x80000000)$ E/ a9 X; M6 n# q: x6 H, O- t
#define SHAER_RAM_SIZE         (0x20000)   / ~. r7 U2 O! ?4 v2 ]

! ^: |) Y+ L2 \: f7 G. G9 D4 E3 o1 i+ Etypedef struct
: O5 U; {" {: i& O, q! H& l# W{
: k8 x. A# ]0 p" t0 b        unsigned int a;
, e0 S% s6 N+ A! h        unsigned int b;* u' `' d" z; \0 f! i
        unsigned int packet_cout;  E+ c. M5 x! D; {
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;& h% [1 z* {$ O) }6 n/ t/ J

- G; u0 A1 R  {void read_MSG_buffer(int *baseaddr);
  G8 Y+ f4 X- cunsigned int count_copy = 0;
4 ^7 p# p  c& m% _. w6 C4 X0 Z" R0 n9 J# F# b* r
int main()- @+ t/ K1 f" x+ C& C2 q
{
1 `: U/ {. S/ `& U0 R        int fd;5 l4 P, d% d2 I3 x* l
        int *mem = NULL;9 H2 c/ b9 b0 K9 E) ]/ B; j7 n

% B! X8 c) k+ Y/ ~% N        if((fd = open("/dev/mem", O_RDWR)) <0)$ S! q+ G5 ~# N: @5 @6 T
        {
3 G. j1 J, |4 |  T" C                perror("open error");2 {  B1 `% U5 x/ x* \
                return -1;
" T/ d! E* {- y2 [3 A        }% r3 v- C9 V2 [6 X/ V
        
( U/ R2 [- n3 ~2 n% b        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);. }/ l; ]( W& z

' O$ T  X. [7 N! f. z        while(1)
1 x. l- P* T' T        {
5 i, d* Y" J2 A                read_MSG_buffer(mem);
8 b3 U+ t# g% `% }        }               
1 _9 T/ g" w% C+ J3 p4 {6 _) F}" N5 I2 o+ [" \$ j
) J, H% {9 H' \# Q" Y* D
void read_MSG_buffer(int *baseaddr)$ W+ u, o* M$ U1 T4 f& y- D* b4 C
{
2 V1 {2 D% Z2 U9 v        pRX_MSG_PROTOCOL pshreRAM = NULL;3 D* u6 Z& |2 L
7 M* D* d( X! O: x5 ~
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;# e0 ]* u1 j: F

. X' j, L2 x. [/ b        if(pshreRAM->packet_cout != count_copy)7 m0 `# q7 i; U
        {
) R/ u- q; L# m8 K/ c3 q                printf("a is %d\n", pshreRAM->a);
2 M" @8 T6 a( m* m+ N                printf("b is %d\n", pshreRAM->b);
4 ~; w3 C1 d. |/ M7 N0 G9 b                printf("count is %d\n", pshreRAM->packet_cout);
  h. z- y3 ?# W8 O& `& t. m4 y                count_copy = pshreRAM->packet_cout;
  m: o" o. X9 ?% D6 R        }
2 ^9 A& D0 ^7 ~: R# q        else
. @1 U0 q- o) |* p        {
( @/ b' L3 z* t/ Q8 I                printf("No effective message!\n");
& B: f2 ]; b  T7 h% ]9 @8 n        }9 k% g4 v: O8 f9 a* {
}% g7 l( p  K6 L4 k* ~
/ c" ?' E+ W8 C
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???+ k2 e  B: E! n1 ~# w7 S

0 U$ p( o9 m. U: O8 G+ ?5 j% Z7 b/ ^$ z  q1 b: G% `

- k6 J* v1 Y4 c2 H9 ]5 M' H" Z6 F/ H* T2 |1 Y% q& p





欢迎光临 嵌入式开发者社区 (https://51ele.net/) Powered by Discuz! X3.4