嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
; U, y/ [8 q& j0 v! m5 ~
& Y4 f" f$ N% JOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>& n& t/ T3 _! R
#include <unistd.h>1 e: D( E# W! Z% O% u. h0 |
#include <sys/mman.h>6 o; `. A5 M8 S6 D
#include <sys/types.h>
8 Q8 I& T0 B9 @8 \4 v2 C#include <fcntl.h>) T; e1 g. m: H# w8 k# T
6 T  L- b' h9 V) L4 S
#define SHAER_RAM_BASE_ADDR    (0x80000000)   , ^4 B8 j  ~, Q5 x: @) P

$ w8 [! h7 |0 |$ Z" v0 U3 d/ Atypedef struct0 ?5 K; Z: L. H1 e. K4 \0 o+ M
{
" J4 y- `) [# L5 Q5 p5 m0 J        unsigned int a;, Z5 J+ J3 o) r  _
        unsigned int b;" P% {$ x( N6 r- u  V0 a
        unsigned int packet_cout;
7 z* G" Z+ f& V9 u}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 ~% G/ p) d" Y' D
" O/ [- ?: X/ H2 D6 Gvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);) A( `) ], t6 {
unsigned int count_copy = 0;
" T* M1 ]: B) F! R
( l1 j, @( ?4 W+ w6 E) p
' L/ D' K1 _6 Rint main()
  v  U7 [" |% m$ m{
5 O! r8 o6 N  B% m        pRX_MSG_PROTOCOL pshreRAM = NULL;
+ [: [/ X6 L6 p0 _4 n- K        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;. X6 f8 V& T2 t; c6 i/ y! j7 A

3 {7 F) _' M6 f        while(1)5 r9 u6 v- T+ W% G
        {: N# G- t! H& D/ k
                read_MSG_buffer(pshreRAM);
  ~1 E5 O, D9 F* v- t3 [, K, E# D        }                ( ?& Z4 M/ T) U( [& d* ?/ r" y
}
: T6 g8 x9 Z4 z$ H' V5 R5 y: h5 [0 Q4 k* n0 u0 n: D% b1 N9 N3 _( \$ Y7 N4 E
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)+ M0 m8 x; m1 P
{
/ V# _" |2 E2 E: _7 a" |1 ^6 Q7 d        RX_MSG_PROTOCOL buf;
" j0 Q$ ^: `$ U$ x        3 _2 W( V/ G; C$ e  b0 l
        buf.a = pshreRAM->a;. \. g1 H, Q- Z- \( \2 b- J6 Y; N
        buf.b = pshreRAM->b;  i* `; Y0 p* ^+ i' q+ ]* j
        buf.packet_cout = pshreRAM->packet_cout;
% ]4 `7 o3 m4 M* w9 f        1 |; N7 y: U. x8 G7 p
        if(buf.packet_cout != count_copy)4 Y  G  O' k* d. L+ A
        {2 @" `5 A9 E" [! D% N1 [
                printf("a is %d\n", buf.a);, y6 w; R4 q- O1 G
                printf("b is %d\n", buf.b);9 p  D* r1 c8 d( ]
                printf("count is %d\n", buf.packet_cout);
# p# I7 p" z  m/ M                count_copy = buf.packet_cout;
+ o, h# T, W) P$ [3 Q5 \/ f9 H        }" T$ Q$ K/ ~/ R) p  `" C
        else
5 @* b7 {0 Z2 b3 m) J% s+ r; y        {% \; }# Q) y5 f) w
                printf("No effective message!");( d, A& X1 d0 a" T( M
        }2 r0 \, S9 P) T3 ~. G$ N/ V
}; @7 O1 E; j% y; o

1 y9 ^; d' Y$ D) B
7 L2 v, }4 @0 P+ N$ ?) Y) U但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
, [  g0 C2 F4 f/ B% F1 ~使用下面代码,对内存使用了mmap函数后:( H$ `" y1 e, b6 X8 [
#include <stdio.h>
8 {- j' _( X; N7 x" ~) ]#include <unistd.h>7 }1 W7 g2 Z1 O* _7 q
#include <sys/mman.h>
0 @& S4 F, E/ o6 e1 T- O#include <sys/types.h>
5 l6 L2 `: }0 E, B6 y#include <fcntl.h>
4 e% y4 F- A6 u$ D4 Z) Z* x; T$ m1 W; C( t6 w
#define SHAER_RAM_BASE_ADDR    (0x80000000)
& l" O9 \2 t, I#define SHAER_RAM_SIZE         (0x20000)   
; P+ `" h# Z+ c, h" ^9 L4 E  g( t9 H3 c/ T) {) E
typedef struct! [2 N, ]! t8 H! V6 Q7 E
{
$ w9 ?' h6 {: R" l" W; P        unsigned int a;$ x* Q. u- u+ K. w; e+ L9 J5 P
        unsigned int b;/ Q! i+ W& q4 R, D; S* [
        unsigned int packet_cout;/ t" Y4 `( \+ p7 t
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
$ d2 ^* k) R9 z* U1 l2 p, }. S" t8 _- u; e( W. x
void read_MSG_buffer(int *baseaddr);  `& |) q, Q: q1 D# _  p4 u' u
unsigned int count_copy = 0;) X4 n: ^9 F8 D6 o
! R5 W6 Y, S( I6 ~( ]3 `, V  R) W6 j; U
int main()& M" \: F1 j: l! @
{
) g/ @. X0 ]3 X6 a7 Y        int fd;$ ~$ }0 y# k3 P7 F* C! w
        int *mem = NULL;( w" [. K) Z. r! n) D' N
. A% O! |7 ]" e, k& Z
        if((fd = open("/dev/mem", O_RDWR)) <0)# j6 U6 M& c2 g8 _! H
        {
( u, t# {$ j  K% r                perror("open error");- |3 u% u+ V9 T2 \" G, z
                return -1;
. k! G- F) F) A! O. y* B        }7 {. K+ Z' Q: }6 G& Q& G% t
        
* e5 ~0 b& ^  r( C) ]) N        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);" R7 |% ]3 U5 w  ^' O1 c) G; s
) ~: E& p% c, Q* Q8 q
        while(1)1 ?5 _  c3 n; C" k6 p" |9 _
        {
9 g" X+ S) O* h2 D                read_MSG_buffer(mem);
  t$ ^7 i% I, J: R, O        }                ' x3 v$ e! m1 b& p( O6 g$ x5 B
}6 E! c; b% f: K8 P4 }+ a: W$ M
8 q4 b" D/ d& c" Y& v! M
void read_MSG_buffer(int *baseaddr); {% K7 I9 o0 [. F# j- p
{( |# u( N( ~/ p7 Y
        pRX_MSG_PROTOCOL pshreRAM = NULL;
* Y0 G  p( t+ e! L! z$ X% e6 `8 |8 w/ w8 L7 k! p
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;9 y, j9 x0 |* t) f
" ?0 |/ r  B- n* y( h
        if(pshreRAM->packet_cout != count_copy)! H# Q5 ^1 ^+ Z, a) R# u. J1 f- s
        {
* l: q) ?% I( k4 ~$ J; R! m2 O                printf("a is %d\n", pshreRAM->a);! F4 `; [# V# a6 {. G
                printf("b is %d\n", pshreRAM->b);* [: L5 |( D4 f! D( K! Z
                printf("count is %d\n", pshreRAM->packet_cout);
, R% E" q/ x9 X  h7 W# r+ Q                count_copy = pshreRAM->packet_cout;
+ [# h: o2 C# S$ N" m6 k' I0 B        }3 n8 g* i: B' R7 G9 ?1 `
        else
( ^& c; h4 }) @  I+ {& p3 b        {! A% x# @7 V, R4 _- f, m$ K) l8 K" A
                printf("No effective message!\n");
* N3 y1 f! @  L' j$ Y# u        }
; P+ S4 U* f; A}
' F* R1 r/ |( Z! ], G1 y5 @3 z2 |2 r; W8 ]
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???& O4 B  T: E; i6 H9 O$ P1 H

  G% z0 Y0 k, S' K/ K: k  w5 R5 V8 }8 B* ~  {
) X: h6 ~) o, p% q
" P" ?0 s. [; D3 `# L/ }





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