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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ' s6 q# g6 C. u+ C) {
6 n. L7 l% T5 a; l; r0 H
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
- D5 ~, O" [3 y" B#include <unistd.h>( G9 y2 G$ h& G2 W, V% N. M
#include <sys/mman.h>
- [9 f+ j) ^0 z#include <sys/types.h>3 j" I( C) N! P
#include <fcntl.h>+ ^9 {3 o. R7 i, O

( J  S' z2 w/ a) C7 L2 {2 J9 B#define SHAER_RAM_BASE_ADDR    (0x80000000)   
- [2 b" H% Q0 e: Q5 T3 k( f
& p+ G  x; }- }, ztypedef struct4 r1 \- B* i; j1 l; ^
{
7 t! M) B- Z4 V# s1 p/ A/ C4 m  |        unsigned int a;
9 i( {( c" ~; J8 O* _        unsigned int b;
1 J' n+ K. [4 k" L" ^2 A% x, g        unsigned int packet_cout;
7 r/ f: [; B; s: S" o}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;5 D& l+ }# j2 T: a
* I7 {1 L4 l2 p4 P9 a; S2 F/ y
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);. _0 V. @6 l) G* l
unsigned int count_copy = 0;8 A/ }  ?7 d+ z* p7 b
% R" W2 {: a4 [7 H- a) \3 K

) j: Y$ c5 _$ d% r2 T% J. kint main()
& k" R9 j1 J$ W3 O3 }# D( @5 F{9 x; |& b  O; o9 a" u
        pRX_MSG_PROTOCOL pshreRAM = NULL;
5 M0 t% G- j) u2 ^: x. M        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;( o+ {$ }: r& N4 `' L

: B7 ?5 x  }- I        while(1)
3 b3 m( n; L6 p$ M        {
1 g) n) B! U3 \                read_MSG_buffer(pshreRAM);3 n9 v; d" g" U; o% ]
        }               
0 n$ ?7 v7 ~( s- W1 V}  G# \$ N+ h% L* c* i/ |
8 Q: D, i2 C: {0 e7 y
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)% m! h/ H4 N, q7 _
{1 I% H  I' L/ H) K0 T/ Z& B4 T; n% j
        RX_MSG_PROTOCOL buf;4 ?8 O7 c# J# E0 G7 |) }& S
        : O; R( J5 ~1 K
        buf.a = pshreRAM->a;$ a/ Q4 z9 C) ~, _- F2 A5 ?; Q4 Q
        buf.b = pshreRAM->b;. I% \, P6 i9 @3 E8 `, z* }
        buf.packet_cout = pshreRAM->packet_cout;! M& L  o* V# |8 E; h" `" d9 }- M
        0 ]* u9 b0 c- V
        if(buf.packet_cout != count_copy)/ U2 d# ~7 S. I% Q6 n
        {
: g6 L" e3 |# q2 E7 f: h0 ^$ b( L5 `                printf("a is %d\n", buf.a);
! \; H4 ~9 g7 ?7 y- e: ]: x                printf("b is %d\n", buf.b);
1 y, N% ?- @" G7 J" ~) [) K                printf("count is %d\n", buf.packet_cout);# E, r' B/ n& _# D6 B( H
                count_copy = buf.packet_cout;3 y' x8 D4 q6 w# `- C
        }8 ^( x2 E, E/ e* J- }
        else
$ ~7 X8 N6 q/ D. P# u0 w% M. S        {
( j; d7 l- [8 b                printf("No effective message!");
2 V/ }! h% u: `        }1 ?, ?% N) s( y5 [  S8 f
}
! V' u$ ^7 Z0 f2 b3 B
/ J: v0 E, W; F1 I2 j- U
1 M5 a1 C5 p; u! m5 x  Z但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。9 _0 \8 e% m( }% K) J" u
使用下面代码,对内存使用了mmap函数后:
2 f1 p* X8 ?9 J; Z# o' x#include <stdio.h>
; y. f$ h6 U$ O) W#include <unistd.h>7 H2 H; ]1 I8 v4 s6 r9 f. }0 Q5 Z
#include <sys/mman.h>
: Y) M8 g' d  H: a  V2 Z#include <sys/types.h>! ~# C  H( n# T1 ^# @2 e( ~9 H6 x
#include <fcntl.h>
3 _5 s& R0 s* P+ X+ V
; v- ?( g4 Y8 d3 x5 h#define SHAER_RAM_BASE_ADDR    (0x80000000)
+ @* s, }# W$ G& G! Y#define SHAER_RAM_SIZE         (0x20000)     w- Y' O' ~  X$ L6 f
8 X( ~- }" }5 Y3 o2 f. s
typedef struct: }2 ?  ?0 ]1 Y# |
{# e# c6 M0 Q% B9 m  \8 Q
        unsigned int a;
- V  S9 V8 K; D# x% S, N9 a        unsigned int b;
' c; G4 c! F2 I! f4 P3 k        unsigned int packet_cout;* E" s! o- x0 f; X  K& q
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
$ K& u" ~- e' [) V' N- y6 }( y" a+ O3 A0 L/ B
void read_MSG_buffer(int *baseaddr);# F5 C- o3 W$ S" A6 Q
unsigned int count_copy = 0;4 e; [( X1 b; _* m. ?( i5 J

( \6 w7 D/ D/ o3 L" _int main(). `7 B# O4 v7 s; O
{' V" Y6 R0 Q+ P' K; t) c) f
        int fd;
( C4 G  R, Z* z- P        int *mem = NULL;
% @( G4 Q  p& a$ j( K; j/ z9 {9 Y: Q5 U2 G; A9 x: N
        if((fd = open("/dev/mem", O_RDWR)) <0)
) x- ^$ m) ]- N, Z        {
+ E# Y0 t! r! N                perror("open error");
3 ~# M  W+ ^: [5 U% Z( `  H: E                return -1;
- S3 p$ P9 K6 A2 r% V% f        }
* e/ x6 A) j$ e1 f        9 E  X- t. C0 ]/ \6 _( l
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
& a5 V: |4 g& m: H8 F% e! P  u) w8 j2 z$ c; u; i8 B6 M1 a# m
        while(1)
% c2 y) f; v/ U' o7 ^) P        {
7 j" _' |3 v% ?) g' Y                read_MSG_buffer(mem);
5 M8 `3 P. \3 O  q, p        }                $ G. B  n3 }+ a
}) [9 |' F$ h1 n& P

5 C, J$ Y7 e9 b( Lvoid read_MSG_buffer(int *baseaddr)
: A- k" i: ^: p. y. [+ b7 b{. w# B1 `7 y' y- _
        pRX_MSG_PROTOCOL pshreRAM = NULL;
7 V: e1 {$ O2 m5 l
7 G; {$ ]2 a% r: M& Z* K        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
, C6 \+ e6 j! G6 h$ ~
* p7 J! y. o* l7 `* m; S9 i1 x        if(pshreRAM->packet_cout != count_copy)
: `/ S1 r; D. L2 T& y        {
, Y6 _& F- z" h                printf("a is %d\n", pshreRAM->a);
( F2 K& R0 X3 D- X: H                printf("b is %d\n", pshreRAM->b);% t. ?. |2 V" P- [+ K, b5 k! S
                printf("count is %d\n", pshreRAM->packet_cout);
- ?* L2 G( L6 z& U5 ~                count_copy = pshreRAM->packet_cout;' W7 E- y4 ]$ t" J
        }, [+ c0 f: |4 c. m$ N3 s% ^
        else* l# h0 F+ v2 I; e+ Q* U) n1 }
        {4 ]# p( Z/ k6 |' S! d
                printf("No effective message!\n");
$ i* Y0 z: h) X, Z1 n4 O        }
/ d0 I2 U0 S# D6 s! {* n) h}
1 f" ]* W& G  M1 \& ~& i3 K/ U$ r# E+ |9 p3 w% w2 k& b
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???) `" w. p2 p/ y9 e6 z. E

  b& I8 i0 R1 _: @
; n2 ?4 e! S2 B6 a" a/ _9 j# t% c+ {9 W' |
1 [3 J/ U0 @* {- B' j
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-9 06:00 , Processed in 0.039902 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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