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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
7 P- t9 a- R: N) A+ }* A* u! a4 c
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
  M, S4 }. ~$ u9 B#include <unistd.h>) O; J" [5 o6 m2 Q- T
#include <sys/mman.h>
' o6 E6 ]4 x- H/ I#include <sys/types.h>  m) A' ~! Q/ x7 R
#include <fcntl.h>
4 c, \6 o! x& @# t
2 i; }- `/ q- L#define SHAER_RAM_BASE_ADDR    (0x80000000)   8 K, {* G6 Z' M" t6 {2 q
" l, c! l* r5 d
typedef struct3 ~! t3 ^  [- x" d/ V- b" h
{' |4 _1 {# Z, A
        unsigned int a;$ R8 W* P  q$ X$ b: }6 c* r
        unsigned int b;
1 X9 Y& K  [1 ]  u6 y8 x: ^0 F; n8 j        unsigned int packet_cout;( c' }3 A& l8 }$ B% a! G, z0 R
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;4 M# F+ j$ ?' g1 l$ i- |, O

& q6 G* O! a4 g: `void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
8 \  N4 ^# _7 y* k1 Munsigned int count_copy = 0;# ~3 Y" r3 F+ w0 V* `
4 A$ s6 ?2 p+ p" j

0 n( C: @- z7 t7 ^9 d0 k0 o8 sint main()& X2 i" o' `3 S; b+ s9 x
{
# v3 h% k. i; V; }        pRX_MSG_PROTOCOL pshreRAM = NULL;
# e1 k$ z0 R4 [1 d        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
' B8 ^6 D, @) Z: e/ G+ r
) _; J. C* U6 g        while(1)1 A0 d/ E. w+ \' m
        {0 I! C3 a& Q5 C% X; L6 n4 e
                read_MSG_buffer(pshreRAM);$ `2 f1 @9 c& V, ?: X
        }               
( P! x" k% Q$ X$ d0 }}
$ r  |+ g3 U( c: r( B$ v2 p* W0 c! y: a1 D  x9 A. G4 g" m* Z! h
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
1 `8 @6 l7 i( x6 M/ o- u{5 e, I$ N* b- ]+ x" s/ W+ y
        RX_MSG_PROTOCOL buf;
3 D0 F% U9 H9 ]        ( D6 \; q& W- k6 L' e- h, U
        buf.a = pshreRAM->a;" ^, p; M+ G& m# s+ ^
        buf.b = pshreRAM->b;
; Y  }9 H5 O+ D4 h8 U5 c3 t        buf.packet_cout = pshreRAM->packet_cout;
' ]0 m: z* m4 E: r7 k9 P" `, {        
8 K0 z* T" u& a1 K5 M1 n% v        if(buf.packet_cout != count_copy)5 b! ~  m. V( A: Z, N% O- A( E& s
        {4 F5 h: Z% t( I: b. ]! C
                printf("a is %d\n", buf.a);1 W. G/ ?+ z* C% w
                printf("b is %d\n", buf.b);  j  h- N1 h4 w0 x' m- H8 R% d$ ?
                printf("count is %d\n", buf.packet_cout);
6 P, T7 O8 s7 O2 E$ h                count_copy = buf.packet_cout;
& ?/ D9 c' c) z1 S$ |1 X) `        }6 q( s( R5 j4 V  E
        else8 L& F' t' |$ z- C
        {' D& Y+ w1 t& ~9 B
                printf("No effective message!");1 q) V, l0 J& o
        }
! @/ w, ]6 A' `- P+ z8 R, J) m( ]}' p3 r/ K- R/ `
9 a: |, m3 \" ~$ V: D9 i0 n; t

% e6 w& C, _5 N( h! K& S但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
! E0 L7 h& H1 u2 N" N. j3 {使用下面代码,对内存使用了mmap函数后:
+ \7 L! V1 A+ @, Y: @3 E( w2 B# P8 H, q#include <stdio.h>7 j! d, E1 E, r0 t( T  z, N
#include <unistd.h>, P5 l) O" P6 Z
#include <sys/mman.h>
0 R0 P- t; F( H) @' M. |' n#include <sys/types.h>7 r# C7 m/ J- i% V" \
#include <fcntl.h>
1 Q- t6 _/ ~; n, X' [5 s: z6 ~3 q0 Y) M: P4 n& E( o
#define SHAER_RAM_BASE_ADDR    (0x80000000)
0 Q  T" s; L2 s: i9 v$ Z' E#define SHAER_RAM_SIZE         (0x20000)   . g9 ^' M0 h4 V  _2 j+ C6 g
" v, C, v& a, c2 X8 n
typedef struct  K" \- V9 e, c, ~; z
{
2 g. J7 X# N9 I        unsigned int a;
* z/ I. G9 h1 L2 e        unsigned int b;
$ l% U7 c# K$ j% E5 i8 F, S8 u0 y        unsigned int packet_cout;
" v/ o" b9 N1 ]' X}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
" r3 b! ~) S  r) g* @6 X5 Y4 w8 I  K
void read_MSG_buffer(int *baseaddr);: D6 T+ Y2 K* [# B6 N" x
unsigned int count_copy = 0;! D. r- |4 L& x9 r
: G) \" G. e* b/ N' n
int main()
$ @: }' n2 q% u& w7 ~{* p3 e! P9 s6 v0 G
        int fd;2 `2 X: x, e6 R, |* O
        int *mem = NULL;; I' d3 p' v. C; J) y

- g. U( E- |% ?0 P/ k+ ^        if((fd = open("/dev/mem", O_RDWR)) <0)* z6 \% Z% i  E$ N
        {9 `7 n) j, n+ l
                perror("open error");
) u- i' f. k, {6 q" B: k' Q+ F4 U                return -1;  u) m; Y- z4 X  D/ D$ P
        }
4 w, r1 \' O: w* w! M, K7 h        ( s9 {! ]7 z7 H" M9 r0 x; H: F1 R
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);" ^. p9 h: ^' f- e

3 v: e1 J6 c2 }) N  O        while(1)
4 }/ ]5 e* P/ ~* p2 O: J        {
, I8 i' A- ?) Q" N- N( ~0 ?                read_MSG_buffer(mem);3 c- V, m3 ]- ?1 j" p/ h
        }                ( h: E+ g4 A  C$ U
}
- B6 N# m  U+ K' r4 F
  |* L3 s4 i& g; [  A( v* Mvoid read_MSG_buffer(int *baseaddr)' R. g& V8 e+ L7 M8 n
{$ |, s* I5 p/ U3 O
        pRX_MSG_PROTOCOL pshreRAM = NULL;
/ q' z8 z* G- r) k- b
) Y8 L4 q2 l3 {4 ?        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;9 M4 R5 y1 U& s4 y. k1 Q2 h
2 O( P: u: I: x7 u5 E( m0 ^" R
        if(pshreRAM->packet_cout != count_copy)
# h* [5 i! A* f! w0 X6 T% v5 n        {
8 u" D/ ]6 W6 J/ p5 s                printf("a is %d\n", pshreRAM->a);
& L! `3 a5 |( S- B! c                printf("b is %d\n", pshreRAM->b);% W% m1 Z5 d1 J# S5 K0 r1 ]) K
                printf("count is %d\n", pshreRAM->packet_cout);
# `6 C4 h% `. E+ N4 O( n2 N0 _                count_copy = pshreRAM->packet_cout;, S# T6 F- T) y  |5 E/ U
        }
# `5 Y! R8 r2 ~5 ?5 S: c        else  X$ w8 W0 {" D, j! i: j7 f
        {: J4 T5 W7 n! F- B4 T
                printf("No effective message!\n");4 }/ m4 V4 ]8 k9 u
        }
2 F4 y, Q) w) h. l) A}1 t6 o# R5 T$ n* s4 V" _

* |! [! c% ]! J' D) ]没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
/ u! e$ H  P% L( r( z: n( |; _, U8 c  A/ E2 f: c" D

" I8 O  P; F6 d6 L3 V# ]% B# w0 z. K6 |1 M
" F- P- ]" {- o
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-23 17:01 , Processed in 0.041792 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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