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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ( t+ C1 h  h0 B0 F$ ]1 @

4 W6 `0 s+ X) ^, K8 HOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
$ o- V$ D; N; M1 K* e#include <unistd.h>, I; D) {" P8 o/ ]8 W/ t
#include <sys/mman.h>
7 Z  n& z/ L: K#include <sys/types.h>
# q3 H! Q* ?/ ?& z, u#include <fcntl.h>" e& @$ _3 S* M- V' i

3 o6 u- H/ a7 [$ |5 `#define SHAER_RAM_BASE_ADDR    (0x80000000)   
6 v6 _- F. |. f& Y* H% R+ [3 L8 r1 }! R; q# }
typedef struct: M% m4 T+ f' ^
{
* i- {8 s: M& q5 C* {        unsigned int a;1 N& s5 M/ |$ @3 g
        unsigned int b;& {0 g" x8 p( r/ _3 g4 \
        unsigned int packet_cout;1 s' f! z' ~( G: e/ ?3 u
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;! u6 f1 R1 W) K

  A- t+ x# J0 Z" V. _1 Yvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);8 u: o$ e, o- ^% W+ t6 @5 g# a
unsigned int count_copy = 0;
+ H( R9 W* m7 W  c7 {; P0 l6 _" B) r2 H6 r; g

5 Z8 x2 s% U- j  u0 u+ E0 Mint main()4 @# x9 L7 W0 Q' Q+ L. S
{/ n' u  `2 Z1 ^! o# N. `
        pRX_MSG_PROTOCOL pshreRAM = NULL;5 q& e% X3 |& R
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;3 x7 q0 c! L) `& o
) w5 e  h, V9 S4 J
        while(1)! m8 ?/ b8 H- W: N' C5 j
        {$ b% b* @! \4 e2 |( E2 O
                read_MSG_buffer(pshreRAM);2 V% P: T/ B4 x# k
        }               
- `7 E! g. c. b/ e4 T% Z}
% J% b9 k: y, t+ v1 z# |; u" R  c7 {
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)+ h: Y" |  D2 [
{
) p+ L) L" Z9 Z" r/ y3 v3 `7 }. d        RX_MSG_PROTOCOL buf;
; m1 U( t7 u# B) p          r4 n0 f" h0 x% ~
        buf.a = pshreRAM->a;: x( R( X8 H) E5 l5 A. {
        buf.b = pshreRAM->b;
1 k% A3 i1 M7 `6 v# R5 @        buf.packet_cout = pshreRAM->packet_cout;
. D% f9 n1 r8 U1 a$ t$ J$ T        
7 z1 F8 _2 S2 C2 @        if(buf.packet_cout != count_copy)
" S6 o8 v3 S. A- S9 E$ m2 }        {
% b- T4 \* t! A                printf("a is %d\n", buf.a);6 G3 [; G% y! c' i7 N1 }
                printf("b is %d\n", buf.b);
& O2 h6 W0 L: d  U6 }4 s                printf("count is %d\n", buf.packet_cout);& x3 p+ g: C* A0 H. P: G1 O  P- N, w
                count_copy = buf.packet_cout;
  u1 P& N2 r: ~        }
0 d7 g3 ]8 W! ]& x: \: f        else+ z1 g# S2 Z8 s  K$ K
        {! a- B! |- W# E( Q
                printf("No effective message!");
9 z- P% S* h6 f3 G! f, ?- l2 V        }
, z/ X  u& [4 e! @$ v) x! ^}
3 L2 a5 U# N  p1 b3 O  {6 z
) Y) {# o& L  a$ E
; l# N6 Y+ W, E* _6 f6 M, t但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
6 P2 x1 f9 P0 A使用下面代码,对内存使用了mmap函数后:* F3 J  d8 e4 K5 o. A2 A
#include <stdio.h>
2 l* `& F! z6 P9 [. _2 e#include <unistd.h>! J3 y8 m- n0 m" |1 M
#include <sys/mman.h>' x" X( w- w5 z0 M' V6 O" P
#include <sys/types.h>* v" i% j- F& w+ N: W
#include <fcntl.h>
- M8 ?! P, L! z& j2 d7 f. m$ N6 F( q0 u' r: f% x
#define SHAER_RAM_BASE_ADDR    (0x80000000)3 _! V1 D$ a7 g3 f% v
#define SHAER_RAM_SIZE         (0x20000)   , _/ R# [! X' }6 t6 N7 r' ]  P

; F8 R& n: B5 u2 }* t. gtypedef struct# q: c, E' E: E; V
{8 u) G+ `/ V& X+ f5 I1 D. E$ f
        unsigned int a;
, E/ s; L4 e- `        unsigned int b;0 r; `- r) e) p5 P9 U/ ?. E' \' W
        unsigned int packet_cout;
, i  P  f# X3 |3 M, c* o}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;9 c# ?7 _* M) {  ]) q" t3 k
$ b* d2 x7 O2 n' |
void read_MSG_buffer(int *baseaddr);
1 p* y$ h3 t2 I, j' c' Wunsigned int count_copy = 0;
8 L5 f" L: t# ]4 K: z6 e- F1 G! O' o7 p3 k
int main()
; R7 e% b- {7 l{# u" J) m/ n6 I; x
        int fd;+ \7 z0 C: K7 |
        int *mem = NULL;
3 A6 N# [/ P$ S* A, l
& _& o1 t' V& u# y* o        if((fd = open("/dev/mem", O_RDWR)) <0)8 c. F4 _! A* Y7 ]
        {, ?) s2 z9 f) p5 D" \( j' C
                perror("open error");
8 W. o& u- Q3 e) T) H* g7 b                return -1;
+ ^* v% ?4 I7 {. ?/ @* p        }/ L" S4 U$ y; l, B; b* @
        2 |3 c; [' u/ v0 [8 Y/ K
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);; n6 w$ ~: J7 B5 `: M
! }7 }  C# c% o. [" W
        while(1)3 @# N% m/ M: b; Y. ]% F! `, Y
        {8 L: l; g4 s& T! ~
                read_MSG_buffer(mem);9 E9 n6 @# E1 |+ ]2 X
        }               
8 ?3 x8 A" L4 o2 {5 s}
, m- n0 l5 h+ {# Y
4 m; K: [/ ?; A  |! E# G( O7 Ivoid read_MSG_buffer(int *baseaddr)$ O8 w0 m, j& \$ B$ V
{$ |: X  g. ~2 u1 R0 [: z1 p
        pRX_MSG_PROTOCOL pshreRAM = NULL;- m/ V2 \: \$ V; ?- |2 T! r5 b- b

. z9 t2 R/ w; S0 r* O6 _8 W; F        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;. K  \* w( o( \" K7 B) D3 B

. T+ i5 ]/ ?. o9 D        if(pshreRAM->packet_cout != count_copy)
# B) K/ v3 U9 H, M% a: j$ O1 @        {: I. G( @+ J% @/ F# N7 G/ d, P
                printf("a is %d\n", pshreRAM->a);
( X' C5 X5 M7 `% ]0 j2 @# T, c                printf("b is %d\n", pshreRAM->b);
3 o3 N6 k: P) [9 _2 ~! s- {                printf("count is %d\n", pshreRAM->packet_cout);/ z' ~# @5 h, U6 y5 |0 `
                count_copy = pshreRAM->packet_cout;
8 |% `0 C  `9 F        }! K/ ~0 [  a" I# m5 H4 u
        else
( Y4 c5 _0 I1 A1 [        {  ~' l2 n. f% C  ^% r8 Y
                printf("No effective message!\n");; e. V# S4 U+ ?4 s+ H& ~: H
        }
0 Y- a/ N" T; i4 v}: n, D7 u% x. E0 b9 O

7 `  N7 j: |# @% Y0 w没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???# s: H5 Z$ a+ q& u5 [/ X, v1 d
& ^5 K! _$ ~, n' s% a
: f- R* J) _) R* a* e

. {6 p1 ~; [# f% i& g( q* m5 Z& D* k% v/ e" ]
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-13 19:34 , Processed in 0.040971 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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