OMAPL138的内存映射是否在Linux下已经完成??? - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5160|回复: 0
打印 上一主题 下一主题

OMAPL138的内存映射是否在Linux下已经完成???

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 : d+ f1 e( I6 i) \0 ~/ e
' e9 R: D: ^0 O4 |5 G
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>7 v" F4 u" Q- p# \- t
#include <unistd.h>
# Y3 O" j1 r, M" O& d8 @/ Y0 v- \- N6 g#include <sys/mman.h>
1 J. b) j" l/ O# c* A#include <sys/types.h>& x& t: {1 ?5 ?) \
#include <fcntl.h>
+ L; ?2 `* A) o$ ]: h7 |
3 F5 D* d7 V' ~1 z- d3 K7 H# _#define SHAER_RAM_BASE_ADDR    (0x80000000)   
3 N9 i9 [0 e* e* p" A$ E' x& ~& E$ H, M
typedef struct
- b- e+ c0 r1 `! n{  A6 ^- L, U6 O( n3 b% z
        unsigned int a;+ O1 c6 M; B/ m5 @8 N
        unsigned int b;3 l+ S8 p1 }6 ?  i
        unsigned int packet_cout;. R5 Z; P  K! ~
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
: }' X" b* {, }+ R
: s2 C( x# I! L8 k& V6 c  Hvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
5 U; A* S  o8 u7 w1 a5 }unsigned int count_copy = 0;0 {& |; F- G" Q& w# O! b& @5 v( s% U
- T: D5 H  M; j+ z2 a( g
1 W8 V$ O" N4 A. e
int main()
% B5 t, x- \  u# o) l/ Z{
! ?( g! o. n! E        pRX_MSG_PROTOCOL pshreRAM = NULL;  J1 p/ V. N/ d$ B, Z
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;4 n* e9 p) N/ M6 ^8 v/ t

3 c& k6 ]5 b$ Z; l9 s7 f" t        while(1)
) r: V3 O2 ~9 r/ @3 n# H& w0 ]" k        {9 K) {% J1 q* _1 L0 p
                read_MSG_buffer(pshreRAM);
5 V& f* I5 m0 W$ W4 X        }                7 m3 t, M0 j5 m# o
}9 u0 [4 _- Y: W: V6 F

2 a) m! v/ N9 k3 h1 Xvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)' l& p9 R+ G4 j: L- m3 B
{3 `2 ~% y' A8 [0 ?
        RX_MSG_PROTOCOL buf;
6 Y+ ^2 {* j, Q; ^        
, d/ v! j- x, B- P9 r! O2 W# O0 W' U        buf.a = pshreRAM->a;+ {2 y. d8 a" u$ d- Y
        buf.b = pshreRAM->b;/ t$ j$ q7 @1 ^
        buf.packet_cout = pshreRAM->packet_cout;6 D7 `* l( t: e
        5 Z: u1 I: K# W% ]) L. I: C7 @
        if(buf.packet_cout != count_copy)) x: N) \4 ^, p- ~$ B
        {
' |4 M& l# B+ c, P, ]% P                printf("a is %d\n", buf.a);
1 C! @) b# q0 p- O0 |# F+ @                printf("b is %d\n", buf.b);
: Z. c4 J6 G) T7 y" Z& k                printf("count is %d\n", buf.packet_cout);! ]& M/ K! x) C6 i9 Y! S
                count_copy = buf.packet_cout;
- |+ j" |3 T3 n( B4 ~# c, X7 ~! I0 b        }/ o9 `' I3 O1 ^8 N+ r. y. _& b
        else7 P+ K; m4 K* H" y# B& G
        {
7 {+ \( E2 a3 q1 g+ S* Z0 E                printf("No effective message!");
4 [! j' S% B6 z5 T9 v. ]        }
. a8 t! W# k; d! q1 |9 U! o}% N6 N  Q  o# t- R4 H0 e8 n
  e) \) E' v+ c" T( o! v

( R9 c$ z$ o3 b' W# z7 R7 N但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。/ p4 s1 k0 c0 H& Z
使用下面代码,对内存使用了mmap函数后:
- s1 z% }0 V3 f2 f#include <stdio.h>) S1 K" b9 U* \0 w% N
#include <unistd.h>
+ M) e+ O' S- u5 a5 I#include <sys/mman.h>
$ e9 G# K$ x- i& W% Y+ T* n#include <sys/types.h>6 n+ t( I- x' F4 T0 @0 Z
#include <fcntl.h>
! g9 C/ c2 T  t4 o9 E# g
$ J5 d9 m9 Q$ o$ R3 _' _  a#define SHAER_RAM_BASE_ADDR    (0x80000000)' F* D+ J0 g* }$ G' K5 t7 g
#define SHAER_RAM_SIZE         (0x20000)   
0 C$ }& k, t2 }% i: O% ~& r4 O7 ]3 d3 ], M
typedef struct
: d' d  Z; H2 A0 }{5 b9 Z$ B* a  @. r) r. S/ ?+ X
        unsigned int a;
$ X5 M+ W/ k) }" w        unsigned int b;
- f; R  U. z6 h  P4 b3 n! E        unsigned int packet_cout;
- e6 v, ~% |' o7 l" ^+ g- F}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
0 v$ G% s( v& S& ^: g; `5 d
9 r9 S! m& w/ tvoid read_MSG_buffer(int *baseaddr);
: {% n( t, T; `unsigned int count_copy = 0;
3 o. G9 Q* |# k; o' w
& _9 E* V& X; `6 W# B4 I/ dint main()
- D: ~* R9 q+ E" \$ y3 ^{
) b. i/ A' E, }- `        int fd;0 R7 c( z3 c* A! Y' p7 \
        int *mem = NULL;7 ?. [# q, ^2 E5 v

( }' l/ `4 U, `        if((fd = open("/dev/mem", O_RDWR)) <0)
4 y2 [& }  N5 l        {) F0 ?# z! Y+ L# e9 G7 u
                perror("open error");
: \# V0 L; u9 p1 _+ ?7 a                return -1;
4 ?, S* k( a# \% j$ }        }3 ~; n0 M* @, W5 q( O3 V
        # {, a. J% Z% D- s4 O4 y
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
/ T4 u; {% B9 L2 d! R3 u
7 O) T0 r* N+ G$ `( i: v: V* L        while(1)9 Y/ f- Z5 F! w# t% Y6 u& L- q
        {
. I& w2 r% y" S) u                read_MSG_buffer(mem);) `* u$ {  w) d. O" b. `
        }               
0 C1 s  \& k( n}
- B8 A" b( A* X( Z; j- `0 a  Z7 @4 J* O. J) z
void read_MSG_buffer(int *baseaddr)
' w0 @( u0 `) u( z{
( D9 S8 }5 B) P% N* k4 M        pRX_MSG_PROTOCOL pshreRAM = NULL;
- f( h' N* l+ ]3 f! D
% G8 Z+ s3 c8 U        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;# L" R5 N+ B5 `+ _1 l

" Q5 _: h% Y4 G' K3 G6 F) F0 e        if(pshreRAM->packet_cout != count_copy)
% C4 ]6 S0 y) b$ s  x+ p, i        {
7 ~, `, c: [% f$ H# M& |                printf("a is %d\n", pshreRAM->a);
, _2 p/ F/ _. A  g                printf("b is %d\n", pshreRAM->b);4 ^' r3 l3 u( O: n3 x3 u5 Q6 r2 |/ m
                printf("count is %d\n", pshreRAM->packet_cout);
- t# R! {  _' g6 O7 t( C                count_copy = pshreRAM->packet_cout;( i4 r7 X! o' L: T
        }9 b+ ^' _! l' |  t' L9 }
        else
( v1 e  ^; I; u$ ^+ i, O( \4 A        {1 W# c1 {2 M$ q7 d0 p; u7 n
                printf("No effective message!\n");! X) s% ?; {  Q0 l
        }
% r; M& q; |0 [; n0 g}
1 [1 ^$ X" }* S5 Y7 n/ Z) x0 w) D: x8 t
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???" F6 |' i  g$ @5 u% V

  g; L  C6 ^  j
6 \4 j/ |) `' T& B' n& R: {5 N. X# Q- @% I( @) G! n

4 ^# r. K) U( _4 k
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|嵌入式开发者社区 ( 粤ICP备15055271号

GMT+8, 2025-11-21 06:10 , Processed in 0.039544 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

快速回复 返回顶部 返回列表