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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 # @, a5 @( n. _: @4 p% k

# I) _4 L4 B3 BOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>' k. T4 b9 T0 Z- m4 g4 G3 E% l( i( `
#include <unistd.h>
$ \& \- A0 L# H: z$ G#include <sys/mman.h>: J  G1 Q- W) Z- s) e: k0 s
#include <sys/types.h>$ P! m! m6 ]% E7 W2 l
#include <fcntl.h>
/ @8 ~* C7 \/ b5 c0 T
. q# y0 p5 [/ a3 v3 \& P#define SHAER_RAM_BASE_ADDR    (0x80000000)   , E8 K( w7 ]8 [9 ^8 @$ S

' ]7 T+ E" D+ v1 z1 Otypedef struct
% W) R% K2 _' ~5 x7 n{
+ K( {) Y% t# g8 W5 J$ ]        unsigned int a;
9 G( K" B2 r0 {- v- a0 |        unsigned int b;
5 i' z: P' q2 }        unsigned int packet_cout;
2 @: R9 z! w2 a6 z& o) o8 K' k}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
2 n5 W$ n! S  H$ b$ i) O' W3 b# f' r$ `8 |
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);# M# Y+ J% t0 l
unsigned int count_copy = 0;# Z8 n6 v# a5 L  Q' ?( }. v# k

; W: \7 C2 x1 {3 K* |* Z. s. n$ A7 s2 E! @0 P
int main()
' E0 T, ~' Z0 p  c' w) x; b{
' b+ }$ v; p: e6 W        pRX_MSG_PROTOCOL pshreRAM = NULL;8 Z) O' j9 M# L! J
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;; z) M( a& D0 W9 ]9 m' w

3 C8 I: ^* |/ h" H2 {        while(1)
; j, \6 S8 n( [% z! R8 |4 Z        {  ]1 i1 H3 [4 Z* n
                read_MSG_buffer(pshreRAM);
" a% J) Y3 P5 A* w3 M* ?6 @3 L' G! j: _        }                3 X8 K# U# s" |% U, c2 S2 {- _2 j' g9 c
}
( U/ f- w' f  Y+ i: ~
8 P. r' I. z% w. R' Z; Kvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
8 P" j) [2 X5 h# g{3 g& y/ G% B4 q+ _- v
        RX_MSG_PROTOCOL buf;
* h. q, ^" f- S; n0 M        
1 K+ F$ P4 a. b, x( v) L1 D        buf.a = pshreRAM->a;
% s/ T5 n$ a- Z7 Z9 R        buf.b = pshreRAM->b;$ S: \+ e7 j! D3 z: f/ i
        buf.packet_cout = pshreRAM->packet_cout;' R2 }8 R  m: C9 L7 s% B
        ; J" e# ^8 z% i1 V
        if(buf.packet_cout != count_copy)
, U% ]1 G) H1 h# b        {) Z7 ]2 C6 T4 w1 s$ W. a7 f  m( s
                printf("a is %d\n", buf.a);, x, v* s! v5 z& j1 o* b5 Q: i
                printf("b is %d\n", buf.b);# w4 x3 m  P% i( _- q9 i4 U# O
                printf("count is %d\n", buf.packet_cout);2 `8 R6 n$ w; c% M. R2 j
                count_copy = buf.packet_cout;
. l, M4 p6 f/ a1 B        }
2 Z4 I. `; V7 e, v7 ^+ v7 q        else2 b0 O% c9 K# U) d4 @! ?$ T
        {: Q- q, i- ~2 `7 y8 I
                printf("No effective message!");
" k( R; Z3 {: l: p! O2 u, {! V0 k8 q2 C        }- O; ?& k* s2 N
}8 y" V5 T4 c3 ]+ J* l* e

2 T5 r& u( [/ Z0 J7 @2 n7 B! }1 ]* ~6 i! S/ B3 W7 c  [
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。1 P' @5 z; A# d, r5 {
使用下面代码,对内存使用了mmap函数后:3 ]) k& c  |) l. B
#include <stdio.h>" b, ?+ r. e% u4 b2 s
#include <unistd.h>
$ C9 c! R2 P! L% B  Y* e1 |#include <sys/mman.h>- W( \" Z, q0 V' _
#include <sys/types.h>- X( c: n' s% V3 N: _
#include <fcntl.h>
9 p7 u- `+ h; K; o; ^# y8 W9 W5 A/ E' Q9 p/ a+ ~% ?
#define SHAER_RAM_BASE_ADDR    (0x80000000)
/ Q/ v+ ]( W1 }( v* }& w4 d  w#define SHAER_RAM_SIZE         (0x20000)   1 d5 v: S. x% E3 W; _! ?  u  ?/ B" G
9 W3 K7 [  p3 j/ ^6 p5 y; k( \
typedef struct
+ F+ r- q* J# a$ ?$ L3 T{
% D. K0 e$ Z* P3 c& ?        unsigned int a;
8 a  ?+ u# v! t5 c1 A, h        unsigned int b;7 e$ \( H/ d: L/ c+ g- Y( G
        unsigned int packet_cout;
/ f1 ]0 ~* a/ X; E}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
. l4 |3 K; R: K4 J( \' V  Y1 H# \. _/ m+ z) c2 G6 v0 u
void read_MSG_buffer(int *baseaddr);) e. E6 \3 n8 G0 D& O3 M( S0 L
unsigned int count_copy = 0;9 \/ U$ t/ o5 ~5 b: d/ n7 k1 X

- n$ I5 w5 H: m' g; k& lint main()2 |- s' |8 ]! |8 C+ e0 P/ X
{( c* ?" t- G' @
        int fd;# N' E2 a& w- z, n4 W
        int *mem = NULL;. |% }4 B: Q! Q' [
, ~! \* k- x  T, O
        if((fd = open("/dev/mem", O_RDWR)) <0)* v4 r& ?( G) A% l% i) Y' I+ X- t
        {: z% w1 ?& X- U3 U& J2 E: z. ~
                perror("open error");
% P9 Y7 d$ Z, T7 I7 ^$ w% J                return -1;/ m8 s( K) O9 Y
        }4 T; h1 C, H6 r. u! T
        : n# h( `! L3 q1 U" C* ~4 T. h. h
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);  H# t. m& r* r
* m+ q- @' j$ [6 J( z- Q
        while(1)
! O" @  E0 C3 ?) A9 P# t6 E        {
8 w" x: A5 e" V0 i" c1 q/ V                read_MSG_buffer(mem);" C& D/ c& e9 H" J; z: x; C9 v2 F
        }                % {8 c7 `3 X1 A. ^7 E* C
}8 ^$ x$ ^5 a3 l5 g
8 z# o2 @1 L7 ?: f
void read_MSG_buffer(int *baseaddr)7 U3 f: E5 i6 @" r3 `
{* y: f, y0 L; |* w6 g: ^' l
        pRX_MSG_PROTOCOL pshreRAM = NULL;! ?2 p2 t  G3 m$ f3 f/ g
9 B3 Y: V0 B2 S) g: q
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
3 v# q3 z3 q3 K( N7 }( ^& d" @' u7 h3 {8 F$ l3 h
        if(pshreRAM->packet_cout != count_copy)% u- ^; V  ]7 H, |
        {/ r: }# H6 A; P2 ]
                printf("a is %d\n", pshreRAM->a);' P  {, Z* t/ B2 T9 l6 z0 V+ b
                printf("b is %d\n", pshreRAM->b);: z% e# k, p$ S" I5 V5 S  N
                printf("count is %d\n", pshreRAM->packet_cout);  N$ D; m! L3 b4 T' {/ j/ L
                count_copy = pshreRAM->packet_cout;1 J- G9 B. e. g. o: n
        }3 a. Y8 a* Q0 l
        else# k3 y# N5 X1 H1 ~& u' U
        {
$ X$ j. e( ?7 b/ P                printf("No effective message!\n");
9 \6 j4 o% u) X4 W. i7 X        }
6 j$ G  B- |5 }# t# Z/ P- M1 ~$ i0 d}! c: z% d3 ]3 m; w

: L4 o* W4 T6 v$ q1 s/ h  M5 L0 b没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
% a; w0 f- F2 W' y' e/ @
- g1 g' q  m$ ?7 m1 L! H0 [! Z/ H7 o+ u" j+ y; |% Z" o! y$ I

: M+ e+ v/ B' Q* Z: O& n
- E5 g. q4 n  \7 A' W
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-5 05:52 , Processed in 0.037647 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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