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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
  k6 Y6 x- s8 s' q9 Z* V1 c" ~( _# G, p, e# U9 f6 C* G
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>. f9 Q) y7 F+ |+ z3 s  I" ^
#include <unistd.h>
! |5 n4 c4 b' D5 V#include <sys/mman.h>
5 v: R0 ]) B; O/ ?) j#include <sys/types.h>3 f! v$ @4 t% `
#include <fcntl.h>6 N, }; @. s8 g# T

" g5 S. F" C: q5 K! J2 m#define SHAER_RAM_BASE_ADDR    (0x80000000)   
$ C/ e7 E7 I0 o  q7 ?  w/ [/ O* R; ~% ]
typedef struct4 V) V0 p2 p7 F% C" ^& l" P
{
, R3 |( A6 d% V, i( h3 J        unsigned int a;
3 F5 j( I8 U* W$ q2 @" F        unsigned int b;; e2 V7 X$ V: [) R2 t' S
        unsigned int packet_cout;
1 R* r5 q( y9 }# h5 O}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
, l3 w! k- J( M) _+ l- d2 g4 ?9 h# S% l  H: N7 [* u
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);" @. D0 v. i* q5 ~! R
unsigned int count_copy = 0;8 S0 ]. a. m6 W; M3 ]
  R9 x& c" b2 v

( f3 E8 T5 P" Y3 a' c; Q8 Qint main()
! u2 I9 N' `: \0 I{& E8 r& m$ [5 b- }
        pRX_MSG_PROTOCOL pshreRAM = NULL;! ~5 w$ Z. S" o$ t3 V
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
  D6 l7 L. G3 [( _5 S# k$ y/ T7 G. s% k2 T
        while(1)4 N2 {2 c" N8 o% E# T7 O3 ?
        {+ M- {2 J8 V. k! R. j: h1 J+ |
                read_MSG_buffer(pshreRAM);
. g+ J" X( w; S% m/ y" c        }                2 ^7 v" g& z0 d5 p5 h, _
}9 k5 y8 J5 s! i+ y9 I% x: E/ E

/ F+ i6 m1 N, _4 ?3 xvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)' Y" U, X7 A  K0 b8 \6 E
{
  N; J5 \# Y/ U. G        RX_MSG_PROTOCOL buf;. Z+ z# b! K0 O0 {; |* C5 T
        , |/ k, ~6 K" y/ }3 D
        buf.a = pshreRAM->a;
0 T  O8 W3 y8 Z        buf.b = pshreRAM->b;
3 A, L" f4 Y, i3 f        buf.packet_cout = pshreRAM->packet_cout;
3 A/ n. C& X% ?0 A2 `        - h( T, l6 D. @: [# i+ n* X4 k
        if(buf.packet_cout != count_copy); R5 \8 y, p7 _2 G
        {  V1 Z+ u8 u1 p, t
                printf("a is %d\n", buf.a);8 M" q6 K0 A5 d# S* N
                printf("b is %d\n", buf.b);* O. n9 M+ Q$ ?1 Z
                printf("count is %d\n", buf.packet_cout);# P, O" R) m" |& J
                count_copy = buf.packet_cout;
; @: z1 q& d2 |; m: N: z        }. ^1 B- N. t: l2 Q3 i
        else6 k- O+ B3 l6 P/ z+ I
        {
% j6 [) h* n7 L1 Y                printf("No effective message!");
* z8 a+ Z- O) m        }0 B  a" r* V2 m, _
}% i) ^' G$ Z- h/ g9 m! x$ T3 {) x

3 C7 ]" R1 O7 N# U- C0 `2 Q/ K; ?0 A9 e( Q4 k: J5 H
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
+ ^% q3 X6 @. w使用下面代码,对内存使用了mmap函数后:, l# d% j6 K. i  ~) v  w
#include <stdio.h>3 d$ Y2 g" c0 }
#include <unistd.h>- M/ ~0 ?. R/ r7 W% E
#include <sys/mman.h>
/ i2 s% w7 `- s#include <sys/types.h>
+ x0 f6 S/ h5 F  B( F#include <fcntl.h>
) F9 s! h1 U: ^' ?2 W2 _4 V8 i" E& |) t( C# m( m0 ~
#define SHAER_RAM_BASE_ADDR    (0x80000000)
! @: @+ U& a  F$ }. ^3 w8 x#define SHAER_RAM_SIZE         (0x20000)   
1 _- U- j- h4 m
: c/ d  [! u: H, x( d. _  l* V# ttypedef struct
  M- Z* J  K0 X$ n" {{
5 Z  {, K8 n6 y* A1 Y- t% l1 C; n        unsigned int a;
8 N5 ^1 z7 I; e        unsigned int b;
. B: i. U$ ^3 N% U        unsigned int packet_cout;
5 ^3 X0 G- J5 m- c}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
& Z  \: y; d, h* D* w$ ~+ u
0 A5 ]- G0 c% ]! [void read_MSG_buffer(int *baseaddr);
( g& [/ t7 k5 F( E  a8 z" @0 h0 hunsigned int count_copy = 0;: F$ j1 m# u( i3 z) Y) Y
. a5 t( L5 o1 M- d9 m* R
int main()& w& X( P, w) d3 z# T9 R
{2 l0 ^' G0 K% J0 u: B8 l
        int fd;* |: y  X2 O2 S8 i7 [4 f6 E
        int *mem = NULL;
& A% d3 t: ?. P: ]# w0 t0 W, z- B2 h1 ?5 X
        if((fd = open("/dev/mem", O_RDWR)) <0)
* Q2 F# Z; R! _# {. P! o! P        {9 m' [* x5 h+ ]  j# T1 n% g/ j6 R
                perror("open error");' @+ x1 `5 D5 W+ a& Y
                return -1;, I& a0 X: |0 c& [* A! y: a
        }
: |4 B5 q9 |) A4 t0 b        . J2 _$ Q# T( Y4 M7 i
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);" U0 _7 C7 P& g- L* F

2 H" [1 W: g. ~4 }0 e/ P/ h        while(1)
+ B5 Q2 ]( k! I# M# w4 x        {
' h; `4 J5 b9 ?9 Y                read_MSG_buffer(mem);# }. L5 K; e$ D) f+ W( N
        }                , f+ \* y8 J1 q
}9 x% b- \8 G2 t6 q! A* O* x

, B! `# h3 Q/ Y/ N3 w! }void read_MSG_buffer(int *baseaddr)( M$ y# k% e1 O8 K0 |1 N
{
6 A3 P; z# y: Q  h+ Z: L1 c' q8 }        pRX_MSG_PROTOCOL pshreRAM = NULL;
( r3 k9 L$ b5 [' \3 Z3 g# k- m
6 H) \6 ~1 V4 b' H* \9 Y+ F        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
0 b9 o- C* M# G5 A% K. E# E. I* c4 z; K1 C% p! X) d0 g
        if(pshreRAM->packet_cout != count_copy)
, @* K6 h8 N( k3 R* q        {8 m/ b& O8 d; ]9 M  [
                printf("a is %d\n", pshreRAM->a);
' K6 Z& \. P, j4 F3 t! a                printf("b is %d\n", pshreRAM->b);) X0 u/ X1 s# N- M7 {- R
                printf("count is %d\n", pshreRAM->packet_cout);' C5 U. e; B* H
                count_copy = pshreRAM->packet_cout;6 R  M4 K; N7 f( y
        }
( a0 i' v2 K& y) b2 q" n        else4 Y9 ]) g/ ~9 ~2 R6 _6 B% A
        {
: {% r* k$ `/ q5 a. b/ J                printf("No effective message!\n");1 T  k1 v3 h3 V' b
        }: \/ R4 g3 n! s. S: d8 x
}# }+ ^/ v& U. L, ~( W  ~' q# i
$ v( Q+ v  O2 w) b! O
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???5 i; ^- j2 N( l* T
2 W$ ]/ {' w; f

4 x6 O( I0 B, q& z6 f, r
5 Q* c. N; n- Z+ W5 p+ S2 g
0 K4 o7 k, E2 I
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-20 21:06 , Processed in 0.040661 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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