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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 , e8 n9 F+ |/ B

( [- b7 ~+ {4 r$ K. u8 jOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
& c6 v# Y1 M: B: Z#include <unistd.h>
3 t3 \  Y5 A$ T/ s#include <sys/mman.h>
* {6 f! n/ Y" d  e' B. N#include <sys/types.h>; R% m% W" Z0 T3 s0 x! ]
#include <fcntl.h>" {4 _5 V! |9 Z5 K3 a. c

  n' Y5 A/ ?' u0 m6 Q* ?, a* i, O* l#define SHAER_RAM_BASE_ADDR    (0x80000000)   # c) z4 ~2 E' s$ _
  F. C- Z# _$ n* k, z* h, l
typedef struct
( u9 H6 S. k' c8 z# K) \' \! m{
2 J# A. y( Z7 i0 ]        unsigned int a;4 y) U4 y$ u: f& C* G, Z8 c5 {
        unsigned int b;8 p7 ~* U% v7 r' z9 ~* G9 K! g3 n+ R
        unsigned int packet_cout;6 i$ J* C! H7 f8 e0 Y+ S
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;8 q$ u7 h5 s& o: J0 K
. f) J3 d! i  [! l/ \1 B
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);8 p: G% G. m  C% S( h) x! W/ f
unsigned int count_copy = 0;  ]; @# z& t. _8 R9 b6 l
/ ^! q. u) P! x! G
0 p, D  [2 [' c
int main()
  f# X) u! N8 o0 o; D{# c. o; z( y2 r4 [
        pRX_MSG_PROTOCOL pshreRAM = NULL;0 Z% g1 Z# F, ~. ~
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
7 v5 ~( x8 s8 R5 h" V
7 h) q; P8 U7 g' _% p* d& C4 V        while(1)6 I, h7 j7 E6 N
        {
9 e6 M+ @1 H. Z( D* j                read_MSG_buffer(pshreRAM);" Y$ j% d: r1 U- ^$ f
        }                ( Q# |' Q$ Q3 E/ C( Q0 S
}
2 @* V8 C3 k! j& M* u; q. n3 h1 Q( y5 c+ b# g; a6 t# r
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
" p$ L+ i; y( `% D: l' E8 F$ v{
- |- B. e& F1 E$ ?. k, t, A& X        RX_MSG_PROTOCOL buf;+ l' u4 q  U/ v0 V+ H) ?; Q
        
6 G% k! T9 g3 t3 E        buf.a = pshreRAM->a;
: g/ e) T: \; ~% \: V        buf.b = pshreRAM->b;
! O7 y0 f* Z8 |# Q2 \( J        buf.packet_cout = pshreRAM->packet_cout;
; C! c' w& x+ b% Z/ f2 Q+ j        ) [' V& c0 @7 m& O7 {
        if(buf.packet_cout != count_copy)0 ^; v* R5 d) B- m2 b4 K) Q9 Q9 H7 O
        {
" w2 i3 f5 w6 T1 }1 D) P! k, M                printf("a is %d\n", buf.a);
1 i: r) d$ H  ~  i5 }+ S                printf("b is %d\n", buf.b);
2 ^3 T8 w1 j' ^( c  F: ]                printf("count is %d\n", buf.packet_cout);
. C0 c2 {! A" P9 \                count_copy = buf.packet_cout;
3 |' d0 v" x9 I9 c- G* n        }8 R, D& z! o3 S
        else: f) L+ w) Q$ b- [2 A6 G* `- ]6 h
        {: @  i; o3 X1 @( C* O  `2 t
                printf("No effective message!");
4 y8 o; u: f9 }1 ?        }& }9 W0 t. F# h3 h/ v1 A6 q
}7 g, j5 P8 h) C& F5 A3 y

" S6 }) `2 `1 s9 Y/ R6 @% C1 S! Q/ |) n+ ]1 {; ?5 J; G
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
- Z' {) P; ]2 K& I" N使用下面代码,对内存使用了mmap函数后:
, T% ^6 z& l+ |) K+ n% k#include <stdio.h>! `$ p; w+ ~& Q3 v' q
#include <unistd.h>
; ~, j& V5 }, c% o3 U  x#include <sys/mman.h>
( D0 A$ D, D. |* K2 g8 ?! |#include <sys/types.h>
" b) O( ?  w/ b/ _#include <fcntl.h>
( p  h' d) l7 L$ k: }" J
. _" F+ g1 n( h* j8 Z#define SHAER_RAM_BASE_ADDR    (0x80000000). t) Y$ h% B0 y4 k9 |1 i. w. _9 u
#define SHAER_RAM_SIZE         (0x20000)   / i/ U1 L# o0 `$ A* Z8 p) S8 }
) z+ V7 b, \7 ?7 {0 _/ L
typedef struct
0 F! W+ s3 q# p4 u- P! u{
. a9 E) K: V* z        unsigned int a;0 T  i% g) u0 \1 g* S4 i6 G
        unsigned int b;
8 C( V9 G* N, S+ f2 H        unsigned int packet_cout;
, X; G& R6 D! {- C! Q5 p# G}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
! Y! B8 i" p# p  ~8 A3 u/ E
1 a! t. D$ Q8 x" p/ ovoid read_MSG_buffer(int *baseaddr);
. e9 L- Y* @+ y4 I9 ~, W+ U0 i' Lunsigned int count_copy = 0;8 i+ R# ]' ?1 r( M+ O
1 X- X3 ^3 u& @% N
int main()) ?* F" S0 _1 B9 j$ Z" ]
{
: D8 P" l: G+ x# w2 A        int fd;; S+ m7 }" y# i- [0 s$ n9 o* w
        int *mem = NULL;5 T- d% h" X: p9 \  D
! j: J7 h3 j$ h8 v1 @1 Z) a
        if((fd = open("/dev/mem", O_RDWR)) <0)
; ~( R, _$ d/ S$ E        {
8 F" A, l9 ]- k, F1 l                perror("open error");
! ~* [: u5 y- Z" c& T  A& p                return -1;, ]1 E8 B; ?* e, c# U' c
        }7 K0 q# E( S: j9 B% J
        
) p0 w) \9 a- ?; Z        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
5 l* d2 d/ i7 R+ d: H* }" Q/ f" ~5 d3 g
        while(1)
) }. ~6 O4 i& Q% L8 B+ Q        {
  f& {3 |4 B0 P. R3 P8 y6 K                read_MSG_buffer(mem);
! `* Y# ~5 P; V  p        }               
( ~/ e( B) d7 _' ^; D4 \}
) B1 B3 `) T) J. P( c' o1 @9 C' M! d+ D4 Y
void read_MSG_buffer(int *baseaddr)
; i/ A4 t% }* P- D: {" U# S0 U{5 L) Z1 r0 X- z" X+ L( O3 k: T% G
        pRX_MSG_PROTOCOL pshreRAM = NULL;
! ~. i6 p' h1 B1 X* G
9 h: z/ N+ O, m        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
# e# M; D0 Z; T( D5 y% ]3 u; j2 e; i( k9 r/ H
        if(pshreRAM->packet_cout != count_copy), r, x" k1 V8 K/ [# S2 ?% L
        {
- p, p! h6 I' `7 W  l  l" b                printf("a is %d\n", pshreRAM->a);/ o" a7 \+ \( `2 S8 r9 x8 P0 k& S3 B
                printf("b is %d\n", pshreRAM->b);
! X" e: |* B& L, e& D7 q# P  d8 S                printf("count is %d\n", pshreRAM->packet_cout);8 H1 M/ E2 B3 s' ]1 S2 Q$ d
                count_copy = pshreRAM->packet_cout;6 ^- f* F+ q4 l( w
        }% K, h) J% @  H9 G- L
        else, \5 f6 ^/ p$ Q5 d3 O5 F
        {% A( o0 X% q! Z6 t$ e$ c0 a( z. X* I7 |
                printf("No effective message!\n");- N( `- z, Y, O5 K. `* l
        }) z1 ?6 {  Y# U' Q# y: L
}
$ j+ n, G# {/ a" U2 c# {* v, L) `' V
- s/ I7 T& F( G% e+ s2 ^4 @没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
# B% N+ j. [% y/ B, k8 D" \: h& M' L2 ]" w

  v  `% u2 d# I! W3 n' u* x
2 F' r: @4 U  J3 Z" b
% Q% N1 z9 I5 j; Z+ {* T! y2 \$ l
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-7 23:58 , Processed in 0.039631 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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