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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
% b. s" z; y8 s: O# W
+ v! x# O6 W! I* N9 J: rOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
! q, E: }; ~$ M, i' ], s# \#include <unistd.h>
5 Z( Q8 W: L1 V1 }  w/ R9 i#include <sys/mman.h>
, j' ?! ^& m, [( I#include <sys/types.h>5 h8 {% j' d( o3 U2 v1 F3 U2 {
#include <fcntl.h>
( ^- x+ ^* I" l' L6 z4 L3 l
3 B. D/ K5 v4 C6 G#define SHAER_RAM_BASE_ADDR    (0x80000000)   , |4 O0 i* N. ?- S! U, d
. }7 G: S' N7 ^6 O! ^
typedef struct% m% K8 E* ~- r3 S+ o+ Z0 G
{( s  F) R; O+ }* T. s) k1 \4 n
        unsigned int a;
8 j& m! y# C6 ?' s4 o  D" t        unsigned int b;4 ?3 K- K/ y- b1 t3 O7 J& P
        unsigned int packet_cout;
- p/ C* O; ?% N3 d; T! a" R/ u1 W}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
- u2 c$ d' q# w4 M. z& E* `
, Q  k. F. B& I' P% L8 o1 ?void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);" h1 \5 w9 ~1 P
unsigned int count_copy = 0;
; L0 P, H( F' f' S: M" J
0 `7 ^! {5 v, A7 F8 e% B6 d( U
2 Q/ [! {, i( [, S/ `  mint main()
2 M* t6 `- L) S. G{2 Y; }; U9 R6 P) t) P
        pRX_MSG_PROTOCOL pshreRAM = NULL;7 J( r( h- p4 Z% K1 b# R7 K
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;2 u- e: |( v9 N6 v+ u7 Y

1 R1 F7 J) c! m3 G6 s" Q" t        while(1)
* @# x- L% t! U( Z6 x7 A9 y        {6 a' J0 h! s. x/ \3 U: p9 b
                read_MSG_buffer(pshreRAM);
! g. r9 |/ [( O. V4 j2 f        }                , N+ m4 m- @. M: S5 t% h$ n
}
: i( d5 }+ q0 n$ h- o! z$ }5 k9 `1 C; w, q' q
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)8 Y9 H3 T% j7 R8 K
{
9 U2 J8 D; L. {8 o        RX_MSG_PROTOCOL buf;' E. C8 v: j/ ^  s- `
        ; g  q! V! @1 g. D7 P, ^" x7 S
        buf.a = pshreRAM->a;# W: ^  _# q2 Z) O0 E
        buf.b = pshreRAM->b;; P$ p' @- j, h  u* R: Z; ^( J4 M* h
        buf.packet_cout = pshreRAM->packet_cout;3 l: Y" x+ Q( C4 z& u5 h/ z5 J- U
        % D) p! R+ X# N6 j7 }: G* T
        if(buf.packet_cout != count_copy)
9 Q; b/ V  X8 a$ Z  L        {
/ q& w0 A6 D2 Q                printf("a is %d\n", buf.a);8 }3 X) w% x& p4 H
                printf("b is %d\n", buf.b);
2 Y/ H' A& x' s) A# p                printf("count is %d\n", buf.packet_cout);
1 u+ ~1 h8 z  T6 }4 {                count_copy = buf.packet_cout;
4 t' p3 p* Z/ i: A: a- f        }
* K  ^8 b6 |. ^. r. U3 h        else9 F1 k, }/ l- l6 A/ z0 A
        {9 v4 s3 R$ ?& V0 f" q
                printf("No effective message!");8 u% O2 s) m+ b' Q
        }
% r# f& u8 U6 a; G: N0 m+ M" B7 Y6 j}4 m( O+ o3 G2 \- i/ }
9 N: B8 P5 ^% Q' h; n, N1 T

5 N4 S! q* o+ s# j* x但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。2 g0 b5 B! |( M+ ~: ~  E
使用下面代码,对内存使用了mmap函数后:- b7 p/ i* O6 P3 m% ^8 a2 m) M9 ~6 W
#include <stdio.h>) y  l% y6 H: \( k; N: d
#include <unistd.h>
; f4 A" V4 ~+ J- y2 B#include <sys/mman.h>
( ^) d' g/ q3 O#include <sys/types.h>
2 C# J4 B5 C2 f. E% f#include <fcntl.h>
8 I0 E1 ]6 o+ D0 h8 E% _* |# N7 Q" P$ ]% e8 U
#define SHAER_RAM_BASE_ADDR    (0x80000000)
6 e& b- W! Q2 K" q# ^#define SHAER_RAM_SIZE         (0x20000)   
& v; W7 D1 Q- ?# k! V6 F) Y5 e( u- e% i; d) }& H" N( d& ?
typedef struct
* s- Q% i9 c) v8 }! ]3 d' a4 x{$ E/ L! P2 Z2 u2 v: K0 A
        unsigned int a;& m2 V8 l8 J; V2 E! }
        unsigned int b;9 p5 a! K& s' D) J8 n+ U
        unsigned int packet_cout;
) |/ J# T# q$ @; l/ u7 i}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
" `0 b+ l5 o" u% j; h* `5 {, m8 w5 p! H  g& I' ~& B- p
void read_MSG_buffer(int *baseaddr);
: W& b$ f  P: A2 X' k, g8 gunsigned int count_copy = 0;/ E# |: ~: v0 t6 h+ ]  ^

' C% h5 a4 f8 O3 \0 G4 P+ Nint main(); I' F; Y' Q$ X( i5 j& w
{3 a* I' L4 s$ Q9 ?* u) l' n8 u
        int fd;+ ~. U- C  F/ o+ T& C
        int *mem = NULL;
# o! V. A6 Q+ O4 h! ~  b+ x( E8 E* N
; E* w2 d: G& [) R, u; ]" \2 U        if((fd = open("/dev/mem", O_RDWR)) <0)2 M) p' K" E7 t
        {7 V+ L3 _, v) u& @2 A6 |! W7 S& E# X
                perror("open error");. n4 i. V# S7 m5 l, U
                return -1;( \' x; ^7 m3 O* g. I3 R" |
        }
4 e5 u- h# K9 A        ) `& ?$ o/ a# p
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
6 k6 h4 F6 Q& l% h' |0 X" Y" {' Z( G3 A" M8 z
        while(1)
9 e' a" w, x- S3 W$ W& o- f1 W# {        {3 K4 Y! K8 J% }/ b# T* n2 M
                read_MSG_buffer(mem);# E! l4 ]% _0 a& R8 Y5 E8 m
        }                3 D2 v* m0 K# {0 x  j
}3 G0 T9 w. f, a, J" N3 p  P# R) F$ L
5 Z& v4 |. w! i1 R5 G
void read_MSG_buffer(int *baseaddr)0 M) G. s% P4 j  R' f8 ~7 a% [; m
{
- g# Y5 o+ {  z3 x- P        pRX_MSG_PROTOCOL pshreRAM = NULL;
' _3 f: @; ?2 g/ h3 s7 ?  n% M8 c; v4 C  N- p# c
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
% a1 u% L- e& a, P- ^0 J2 e" r9 w( |6 _9 Q0 ?) W6 C
        if(pshreRAM->packet_cout != count_copy)8 G0 X1 ?1 m9 _$ h& h
        {
& M/ w, }  F1 z. `3 R4 f. u3 r" B                printf("a is %d\n", pshreRAM->a);3 T; w0 w9 Q$ q. l5 ], K
                printf("b is %d\n", pshreRAM->b);
: G& e8 d* _  {: @4 t7 \                printf("count is %d\n", pshreRAM->packet_cout);$ T2 A. O0 X8 D+ f
                count_copy = pshreRAM->packet_cout;
/ S( f' w' j8 l! N$ }; J& ?        }8 Z9 ]. k% w5 B0 T' \8 `. z, ?
        else- p/ b; x% M  f
        {
* R4 s2 F7 b# s- _                printf("No effective message!\n");
; j* o3 m% i' C( _# C& q        }
( w3 H1 N" H4 H0 \) v}
0 c5 D- d9 {5 I2 O. i
) m4 K2 I: Q% y, q没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???1 x3 ]8 c$ s- H) W

4 R2 N3 A6 n7 d5 P& _7 q( a" _0 U
( s/ `4 Z, H% F. N3 P; @$ Y7 I

1 t5 a  e; e' L' R  T
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-13 18:03 , Processed in 0.040309 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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