嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
/ b# G$ ?0 r  p- @/ F1 @9 E1 a* g5 u1 G3 z6 M1 y1 S
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>; G: O6 F% {% \* f/ R9 E) c
#include <unistd.h>
+ D- w' q/ T& v) g' }4 R) J#include <sys/mman.h>
6 H: C" s- G) y; l6 T  }- \+ t#include <sys/types.h>7 I0 z; g/ u# z; {% K2 K$ q/ {
#include <fcntl.h>7 m: _0 R- H0 e7 j: e/ J0 ?

) w+ O1 a% p' j6 Y( n#define SHAER_RAM_BASE_ADDR    (0x80000000)   . x$ ?  e" w" z+ n! t
! P% Q( C# I+ X. I8 \. {
typedef struct. K/ J" A3 T7 M( `# y; U
{
  [0 R6 B; S0 _% ~        unsigned int a;
0 f$ @) k7 E* E" w: Z1 D! E1 E        unsigned int b;
) K0 W% q5 k- p        unsigned int packet_cout;, r. \7 P& u# S) V) j& M
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;# a2 g1 B5 b6 D  P& a- V

; R' m3 c! t0 G8 z. J: gvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);6 s3 |, t' m6 [( p" s' H7 B9 `5 h
unsigned int count_copy = 0;4 ]/ k$ ]% T* {6 |' T

0 |+ t/ U3 C3 j5 Y3 _7 j3 D4 r5 W. V) @5 @9 w5 B3 v3 z  K+ E
int main()
) N5 `/ Y* K6 q; D* F; g: R{7 F9 s% t$ g5 L0 J
        pRX_MSG_PROTOCOL pshreRAM = NULL;
2 ^5 r# S3 e, i% f4 V        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;! R) p( c- S0 h, V, k) ~4 f
+ S8 v3 u. `* E# V1 n
        while(1)" A+ R8 H* l$ K+ {) P
        {' Z( y8 f/ x) @9 r& @7 g
                read_MSG_buffer(pshreRAM);
8 R0 f' u+ T4 }+ d        }                7 A6 D9 t( o1 K
}
3 _5 N0 g7 |9 o! c" Y" e3 U8 w% T: U, I: i* G
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)  S1 E3 }; F" P& @+ j; `
{
3 j1 z0 ?6 X# y3 M* y        RX_MSG_PROTOCOL buf;
+ M  \. F/ z0 K8 k        
; |! Y. E1 ]- }8 e, O; b( w  `" T! E        buf.a = pshreRAM->a;
/ y/ m( d7 h  K* \3 ]) ~9 M        buf.b = pshreRAM->b;
# v6 U  J6 ?8 g5 v        buf.packet_cout = pshreRAM->packet_cout;1 m6 R* h: V: H# f1 V7 D' [) d) ]
        
9 q9 f0 n) k; T+ z+ Q5 {) r$ C        if(buf.packet_cout != count_copy)
5 k! q, W% l+ t" }& Z        {8 M# S7 ?7 f# K' z! R
                printf("a is %d\n", buf.a);/ }" b1 h  |2 w0 _( G& Q
                printf("b is %d\n", buf.b);4 z7 ]# n( G4 A$ U8 p* \- m
                printf("count is %d\n", buf.packet_cout);$ O0 Z/ H* g/ p) \% q( M5 L
                count_copy = buf.packet_cout;8 g5 v/ V' q1 `$ A
        }
# n/ C  m  j+ S, M/ O8 Y! h        else- i! D- r' V$ f+ Y  ]5 R& ^' i
        {
# j7 S+ q5 o  b                printf("No effective message!");, ~+ r9 a, {$ H
        }. P) G; k6 U, a3 y- c) n
}# y  c" R0 M0 c; G5 l; @% L0 a

6 A0 R/ T' k+ x; b  t& Q$ V
0 N! |, B7 ^* B但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。+ U. S/ F2 h8 x# S
使用下面代码,对内存使用了mmap函数后:
- O; ?3 h9 J" K, P2 X' j#include <stdio.h>
/ Y( ~% T0 U9 I6 M- z) S5 i; N#include <unistd.h>
- _0 H% l2 \& |#include <sys/mman.h>. Q1 Z% ^; |. p
#include <sys/types.h>8 \5 X, a" F" x
#include <fcntl.h>
0 t0 w' N( Q! h/ S+ Y" P0 {/ ^- h
% [) B; N( m/ S' j8 @( I1 k#define SHAER_RAM_BASE_ADDR    (0x80000000)6 S' y/ L. [: s7 ?2 j
#define SHAER_RAM_SIZE         (0x20000)   
9 \; K' A9 }8 c( @$ i/ W# e& e9 q. D, J/ w5 u$ ~
typedef struct; }9 J/ Y' u# j) `# W
{
' v0 N; v' i3 y/ v        unsigned int a;$ E/ i2 \* k) e/ J0 B- b
        unsigned int b;
3 U( m* [- i2 b% e% R4 N# x        unsigned int packet_cout;* a+ v: j# ]! M0 s
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;8 u2 f: b& f3 ?) ]
, e3 j" P9 `" F
void read_MSG_buffer(int *baseaddr);
7 ~8 c! D7 i& X" Z; U. n; O6 Punsigned int count_copy = 0;) D# \" y( a7 @! d9 r! h
0 \& [# G5 K. r
int main()) }  s1 G+ R* o7 ]! A
{0 {* u1 D! v# A! y2 t; `2 h6 L
        int fd;8 q2 G  h- @' @' K" ^& Y9 m) V* t
        int *mem = NULL;
8 y1 S( ?) ]" _- o4 k! o' q* x" B8 [" {2 _4 R" N
        if((fd = open("/dev/mem", O_RDWR)) <0)
2 z- a# m6 u9 R" Z$ }        {  z4 J# S3 O$ u% l! y% `
                perror("open error");  j& N& Z2 _, g' N
                return -1;& q1 S+ R. X. z
        }9 h$ r, h2 u/ N  S' E
        7 \- }% _  [2 a' ~8 I( g
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
1 h5 W+ w* \& ]& s, M6 x/ F, |" b% ^
        while(1)
, a; x( T. U7 M# ^; @        {
7 w* i: R' \; k3 I3 w                read_MSG_buffer(mem);
2 p, f6 B) @3 g6 k) {! X; s. b        }                4 u  @. g+ h$ F4 c: ~) v0 q
}8 M, h1 {) O: y$ t# I" S6 ]
1 r  r2 K! K' F
void read_MSG_buffer(int *baseaddr)5 S4 e7 U" j( b6 j9 Q) {
{' ]  R1 l6 |0 u! K5 e: @' _1 a, N6 p
        pRX_MSG_PROTOCOL pshreRAM = NULL;
2 U4 [" ~7 o4 J4 x. C4 u: u6 ^, @9 d- y! m( O2 u$ C# `0 ~
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
; K; F2 }+ U0 e+ @4 D0 ^5 Z; U( Q1 S
        if(pshreRAM->packet_cout != count_copy); M$ h9 ^1 i1 R. _& i9 j2 ], e/ G4 @
        {
- t% m. p+ P8 L( v! \: D3 z                printf("a is %d\n", pshreRAM->a);  p$ c) R. ~/ w: y
                printf("b is %d\n", pshreRAM->b);1 v5 X- `+ `( ^
                printf("count is %d\n", pshreRAM->packet_cout);
" g4 k+ V; J  W1 L9 y/ H                count_copy = pshreRAM->packet_cout;( A* Z! J5 E6 C. u; {3 s
        }5 s0 |7 D6 u5 z$ T* ?3 j* D
        else: j* z* m( Y+ R" v+ l
        {% J9 P  N$ m5 `  P+ H
                printf("No effective message!\n");
0 J( u" @0 y+ B7 r9 A! w        }( e$ S' N: s: W4 |
}
  ?' O7 @, u8 S. }+ h# b' \5 L8 x. w5 K8 o6 R, e3 A
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
" i0 Z5 [# \; m2 k( X8 Z  Y$ u; v7 d& J" c. V9 D
' b5 A& s: o; U  t* \6 n/ q
  K- B+ n6 Q9 ]8 K( [
- ?2 A% h, M1 S" V





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