嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
- I! k- N  l3 s
* Z4 l7 U8 o# i  @OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
9 {2 O% d& G" Q# p) I8 U4 I#include <unistd.h>* }* H: P- |4 p4 G; y3 `
#include <sys/mman.h>
* l) T. t& Y* ^4 a. K#include <sys/types.h>
( q  P0 N1 `  x; f5 k#include <fcntl.h>
7 V0 z  d6 {- w
5 M' w! t2 y9 `7 C  H$ c2 U& j#define SHAER_RAM_BASE_ADDR    (0x80000000)   
2 u& s+ T. n( F* B0 ]4 X# ]5 p
typedef struct" x$ ]% M! z9 A: r/ Y% v
{' C) d7 o: m: ~. V
        unsigned int a;
) o9 d& b# u) H+ J9 i9 B; F        unsigned int b;" x) m6 B( q) b
        unsigned int packet_cout;" t1 @/ @0 h0 l' y) h2 P7 L" X- ]/ z; }
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;+ ?$ [5 x  X2 r; o( s
, b( p1 w9 ]! {
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
1 b9 K0 \, D4 ^# m; i0 aunsigned int count_copy = 0;
0 W3 F4 W- b1 S( i
8 _- `8 p2 o: i( n/ |' O% R; O7 O  S9 O& {4 D/ Y
int main()/ w0 j5 R; [1 Y
{9 ]8 @' B5 a" G$ b  }
        pRX_MSG_PROTOCOL pshreRAM = NULL;; O7 Q# U# `' D& l
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;7 R$ v! y9 p2 R  W
9 L9 T! I1 L( F. f! P* g1 T( [/ H
        while(1)
1 P+ b! G% |$ q! l" A" a7 s3 J9 z        {/ A' \1 V* O" A
                read_MSG_buffer(pshreRAM);/ Q5 j, O! g; |! O" P, @/ m
        }                ' j- a9 N7 q( n  M
}2 m* i. A8 `/ F- b4 k% d! _  Y
5 X. Y, Z5 `3 y4 V5 a
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
$ x4 A7 ?! Z; t" `* h, l{7 u! b9 }" J% o% Z2 N5 H# I
        RX_MSG_PROTOCOL buf;1 y7 d( u" E4 v' b: n. X  G8 [0 u$ T
        
0 l  a3 r% \4 ~  G# p5 O, l" N0 ^        buf.a = pshreRAM->a;
& m/ k" ?' [* r* ^) v* P* u        buf.b = pshreRAM->b;, }7 |* t' v0 M6 I2 o5 H
        buf.packet_cout = pshreRAM->packet_cout;' S/ L1 i9 C; F3 `
        
: Y) d& A; M: \; j* y        if(buf.packet_cout != count_copy)
: M4 L8 O; k# S2 L$ o        {' U; ?, _0 C' }
                printf("a is %d\n", buf.a);$ x4 O% _1 y- g! y  p
                printf("b is %d\n", buf.b);
/ d8 |# P4 y5 |6 o3 h" R3 H; |* B                printf("count is %d\n", buf.packet_cout);
! `+ v# O5 P8 x( I9 g. H5 q8 y5 ^                count_copy = buf.packet_cout;, o, K4 \: d' ^' ]8 w
        }+ m  P6 O  b0 |# w
        else
, }$ d! M( U) @        {
+ i4 L0 q. p$ [  p9 ?' w7 B                printf("No effective message!");# S( F/ j8 H+ ?, s" Y
        }
5 R/ \) h9 e5 W# F* R9 B9 Q, d}
7 I1 ~9 o  ~# M: V- [+ W2 B- |7 V& E% U( c9 D
: u9 Y  J8 Q0 b9 c  J4 O
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
) r# ~: C4 v; J0 |7 k* G) R* M6 g4 |使用下面代码,对内存使用了mmap函数后:
: s1 c; K8 W3 @4 j4 y. c! O#include <stdio.h>; ?5 ]# ~/ [9 F( g8 q2 o
#include <unistd.h>4 w7 P8 [+ k: D# z+ E" R, {$ n
#include <sys/mman.h>! K- S1 Z/ }/ ^
#include <sys/types.h>
6 `0 M0 [, l/ ~#include <fcntl.h>
5 X3 r7 i- o' X" k4 j. \, |
! ~% H' S; |6 e' ?9 I#define SHAER_RAM_BASE_ADDR    (0x80000000)
6 s+ a0 n$ H: g. X& d#define SHAER_RAM_SIZE         (0x20000)   ' t2 }: b& I$ `7 Z
9 A- t7 n1 v& e1 Q  [6 c
typedef struct* f5 K" N+ b( b0 }' R. y, u4 O
{
4 {/ Q7 M% {3 L. d7 H7 ?# [/ z        unsigned int a;
+ p" `% W' P1 h9 t        unsigned int b;
2 U/ b7 Q1 Q. o0 _% {# g        unsigned int packet_cout;. O; A: J, S5 I# s& c' Y' }
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
7 W. X$ j( ~' Z
/ a3 q5 l$ ^5 \; m; H0 ^. rvoid read_MSG_buffer(int *baseaddr);
+ V' D4 ~* K% L, l0 sunsigned int count_copy = 0;- C  O- u  e% G+ a

0 v# v/ E( r9 C0 g) I, Bint main()
6 W/ [, @; X. ~7 x( {- ]/ e{
& O. z* I  d5 n6 [& G" P0 }8 D        int fd;
& J- L: L- J; X5 c        int *mem = NULL;
4 c) m+ z% ~2 h
1 h! L% Q8 w0 C) i        if((fd = open("/dev/mem", O_RDWR)) <0)/ ]) F* c4 U# K* ]9 J4 Z
        {" H9 C. O2 h2 k6 L/ K% w
                perror("open error");) Z/ S& k0 X4 F3 `8 i
                return -1;! r' g9 A, I5 i6 {
        }! z; [( }; t4 F4 x' ~, \: F" `- m
        9 I) P  V6 p4 v+ a& r
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);, J0 L- z, H7 K  {6 p" S

, J, G# |  |3 _        while(1)+ d0 @' _( W& \7 A9 E( M* a
        {
# m  }' q, c' V" g2 g8 H# l                read_MSG_buffer(mem);' y6 _5 Y4 d. S
        }                ) F! d' Z7 `( k7 k" \* Z; [
}
8 H" }* {% M, V; d$ j6 \4 r# x5 U6 ~' V- Y' S; s* j, R
void read_MSG_buffer(int *baseaddr)
  B3 V; t+ h; a9 z7 x# v{
, d2 Z, [% T  J+ c, y        pRX_MSG_PROTOCOL pshreRAM = NULL;
) t5 S( {# O/ B) t8 [3 E# [: `% B0 o$ w; h: ^
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
9 I3 b# E9 \) u; i2 }& P# p6 G; G# T! B  `4 p2 d; T9 s7 A
        if(pshreRAM->packet_cout != count_copy)- J  Q* W, e8 D% ]% s# g% t0 K
        {+ F; @* S' V* R7 E* f
                printf("a is %d\n", pshreRAM->a);
' j) e2 ]1 E2 W  ~6 Z. T0 u3 Q                printf("b is %d\n", pshreRAM->b);; T+ e$ b  q' `% b3 f: Y; k
                printf("count is %d\n", pshreRAM->packet_cout);; h* m  w- ?. W5 n' y. J5 j
                count_copy = pshreRAM->packet_cout;% n+ ]+ a2 |9 Y. X
        }6 ~2 U! A7 S2 e. \- M
        else% N& M+ u- b& d' H
        {: }) H; z3 }) l% _: A
                printf("No effective message!\n");
! ~& ]( f  m# U        }
- C- V+ K+ Q& b0 t+ z) m8 ]}1 v. F; F2 z, v) @: J! p8 J+ t
+ M5 `, i1 F) b% |. l1 j$ V
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
7 u; ?9 ]$ [% G* i5 O7 a# k7 @# A  \$ Z6 `) J: _  Z, |: l* T& [" z

9 c( t3 d+ h2 @' _( f5 ?$ S7 h) G; `8 E

$ a8 R" s% a( r, ]# P




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