OMAPL138的内存映射是否在Linux下已经完成??? - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站
点击跳转“创龙科技服务通”

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
' j2 l  c; ?" t2 z
5 b/ Y! w; t7 }: K2 }% H9 @. aOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
8 R7 G, W( _' _* j  r& D8 ^#include <unistd.h>
9 x4 o* X- v* {+ @8 B+ c#include <sys/mman.h>
* ]/ R7 |) G% o$ q' U( ?  l#include <sys/types.h>
5 ?2 `1 n) i' }! W! D" C#include <fcntl.h>
2 Z8 r4 i, V( j( H$ q5 o8 i
& C1 g3 J7 W) Q1 [( A! w2 n#define SHAER_RAM_BASE_ADDR    (0x80000000)   3 ^/ o+ n3 f9 f
- d# X6 M( W- v# {. T  g
typedef struct
' w; @0 B& b' W$ {1 M$ U2 m* i{
. A8 }, g# f# q% g. ?, t        unsigned int a;
4 y8 Y; X" C" f; K4 {' k6 ~4 H% g        unsigned int b;
8 S* o- Q0 D) O* |% _" N* q        unsigned int packet_cout;/ b, R/ c. f1 a
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
% i% a' v0 F2 d' ]: `, D0 Z- x4 ?3 x5 H4 s3 P+ B) K
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);; U4 V9 m7 m7 p8 Y  x- N
unsigned int count_copy = 0;4 K0 \6 K# x6 ]8 p
/ p8 `/ d7 C. n: D: c0 u

- B9 y9 t6 r5 x3 Z3 @int main()
( @: w9 D6 I" h$ u) Q{
( _- T  x6 }* w  O6 ]        pRX_MSG_PROTOCOL pshreRAM = NULL;! ]" f! N# I# V) q/ E
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
, e8 `; c7 q2 I8 W% [$ t! m2 ]4 [6 N0 {8 t0 ]. H
        while(1)  G  }6 N# l% c! _/ M
        {
9 z  o5 r5 b# V9 N" b. I                read_MSG_buffer(pshreRAM);
" N% V$ K+ X. I' }' x; a' M        }               
: D$ Z- j- F! K: k}
' D! C/ j1 f) N" l( ?% T9 Y; T% \/ g- F
" Y0 W/ \- t- u1 A$ p5 ]: B. `void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)' u! s  J2 R$ {2 Y
{
1 {( f3 p" e! _* _  s1 _        RX_MSG_PROTOCOL buf;, X% e! q1 s- K# F. Y5 |* \9 K
        
+ e' Q3 j0 u7 M+ f& \        buf.a = pshreRAM->a;0 p7 f2 w3 H' n
        buf.b = pshreRAM->b;
" Y) `2 P" g7 b9 r  X        buf.packet_cout = pshreRAM->packet_cout;5 o  h" o; s+ ~. I
        7 L+ F& V% m* q! o+ d: N" T
        if(buf.packet_cout != count_copy): O/ G4 U; n5 [0 @1 I
        {& a8 d. X. l6 b' u8 c
                printf("a is %d\n", buf.a);
. n! ~0 I( L2 R6 p7 h: o' y                printf("b is %d\n", buf.b);$ G8 v" f- ~9 }
                printf("count is %d\n", buf.packet_cout);
# k1 ~/ M8 g* V: t0 |                count_copy = buf.packet_cout;  V) n- m2 H# e9 z
        }* i+ L5 M( c" U4 j3 G$ B8 Q
        else
& ]% F9 V- q. K0 D1 H6 X; c        {
0 m/ m% ^7 \# A9 a- I6 [                printf("No effective message!");
1 O0 z# j' f+ V0 J2 K        }/ [8 D1 m! q( i/ X( f3 L1 R. G
}
$ V5 L2 _3 z& `- `$ Q, t1 g2 r+ r" _0 m$ N1 }: {8 m, o! ^
& w  q$ _8 N7 E0 w/ @
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
' ^( i+ \* [2 P% R: Q8 y使用下面代码,对内存使用了mmap函数后:
+ c& J$ I* W6 F: ~0 l: E, ?#include <stdio.h>
: g6 q; P% d9 j2 f9 l3 C8 u#include <unistd.h>
) `7 O2 M9 e6 I; v1 V#include <sys/mman.h>
  N+ f, A2 j! R. U#include <sys/types.h>
8 y! s" R# [9 L! r) u$ r# D#include <fcntl.h>
; H$ ]& d, h+ y9 j3 F+ {
% d1 P9 O9 h: Y! t; v#define SHAER_RAM_BASE_ADDR    (0x80000000)
0 l( G' N% F  Y# w) F) R#define SHAER_RAM_SIZE         (0x20000)   
- `9 j8 n4 w5 L- B$ b# G: ]" F3 X% q
typedef struct& i; S! o* l6 ?0 J3 R- O
{
  Q  {3 Z- z) K( R( _1 G9 K        unsigned int a;
) Y, P9 d3 C: k        unsigned int b;- K) M8 j6 E& m
        unsigned int packet_cout;
9 q/ }6 A1 _# j+ r! D$ |}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
$ Q: E* m/ x& Q, E$ L5 W
* V- p. l) f* jvoid read_MSG_buffer(int *baseaddr);
/ I( E3 I$ m5 G: V4 Kunsigned int count_copy = 0;0 O2 D" v) y; L; H; B9 w) U) G

. v" w  l$ v. `8 ^* F9 Xint main()
1 }- o. m1 i$ ]  w7 {{
0 G, ^0 W+ q. _" Q0 k: c* y        int fd;# c9 E# T; I1 Z7 G/ Z+ i
        int *mem = NULL;
, m) `) o: V6 M! ?
. X+ [2 g0 s) W7 N6 Z8 R        if((fd = open("/dev/mem", O_RDWR)) <0)
( X, v( |; w4 i8 G" v7 g        {
1 Q8 T0 V% V0 [, h7 S( `4 x                perror("open error");/ z% ~. X1 t. s6 _
                return -1;
4 y8 t6 p) U3 }) D5 A3 _  K+ A        }: G0 K- b# {' F  T9 w
        3 d: ^0 U& k* i3 _5 l8 {
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);3 \  \1 Q" F9 u3 l! d- A" p+ C2 o
" s9 Q, `4 Y4 E6 @; V7 d& a% Y8 b
        while(1)3 U8 J, l& G. ?/ z
        {
- ~% ~! {, L+ B' t                read_MSG_buffer(mem);3 L" l- o. \3 F+ G
        }               
; G% O$ ~+ \3 N/ N2 @% q$ `}
2 z- _. y: x% j6 B2 \  L! i' h9 S# ]' J% S0 E+ P2 u
void read_MSG_buffer(int *baseaddr)
$ }. T) i; R) N6 k. u{
  x, S/ E, h" z$ d        pRX_MSG_PROTOCOL pshreRAM = NULL;
% O: N! G" c% m$ k) t5 j! N- q" ^- g: y/ S5 X  y2 l4 m6 d
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
( S2 b" O* N' {/ w) x0 R0 F, w% ?, q6 t& Y8 V1 q( U. H; m7 r
        if(pshreRAM->packet_cout != count_copy)+ p( h4 l. Z5 T, D. a4 {7 n
        {7 |$ p/ }1 ^2 R4 G' u9 k0 ?5 D; {
                printf("a is %d\n", pshreRAM->a);
# N0 \. Z+ s" n' Y" p6 N0 o                printf("b is %d\n", pshreRAM->b);# @3 G) d7 p: C. O# L* Z
                printf("count is %d\n", pshreRAM->packet_cout);9 I& v3 O" W# R- ~
                count_copy = pshreRAM->packet_cout;/ E  b) f- K  v" f( v4 i( O. L8 ~* p0 c
        }
" v9 N" @8 G4 u% ^4 l3 C, b        else" X/ J- c- T0 Y0 a6 n
        {# v& f/ C6 M! v: Y* l
                printf("No effective message!\n");
! M& W7 D3 c! e2 c# K        }
! V9 I& M9 \6 k$ s) X/ ~}5 G9 ?$ J' X$ `, e' X9 x: x
  F3 f' p5 s$ K. K4 @) T
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???0 O$ L+ u1 c1 _1 k9 W0 @. \' @

& @0 v4 V9 n) Z4 ~' ]8 n* _7 z0 m4 U7 I( h# {
- F# _$ l" q" P" S0 C

5 W1 P8 M" B3 J1 @
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

点击跳转“创龙科技服务通”

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

GMT+8, 2026-2-7 16:07 , Processed in 0.042299 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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