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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 - ]5 r% V) Q2 l3 ]
0 k- {. @4 v+ R3 D
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>- }  O, C+ Y4 F2 @
#include <unistd.h>4 {9 f% g5 S) d" h/ t. e% k
#include <sys/mman.h>2 h& @1 p) A) {$ o: S
#include <sys/types.h>. L. `4 L- h$ [8 E) L
#include <fcntl.h>
  F5 d' C0 |/ o4 K$ R/ N2 l$ Q, z! V& R
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
& g, n& `$ m" h0 c$ c0 Q* S, k( N& [
typedef struct+ i) J- ^) ]& L3 R- Q& k* P
{( {1 M/ e1 r1 l7 b4 ^2 R: a# z
        unsigned int a;/ h& D$ G1 X( D: M7 i# @' v
        unsigned int b;
* s' @# D9 E9 r' K2 [        unsigned int packet_cout;
$ N* `4 k' v5 m' Q}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;" e) B0 I1 d) a5 d
0 n" I/ G& q3 G+ C- g
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
. z4 _) {) R& R3 a8 Yunsigned int count_copy = 0;2 s/ `# W/ C* }9 W
; u8 D" Q+ X6 D( R( `6 Y9 R. O8 I

( n* t5 g, d9 D: [; C. h8 i  i  r) iint main()
9 i* p8 f/ h5 ]{
; v# q# S+ ~* K8 U3 \        pRX_MSG_PROTOCOL pshreRAM = NULL;
& v* r7 _* W8 T! `; G/ T# L3 H        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
+ W0 ?' u" d& S; ?+ r6 Q9 T& B% i' v' _0 t
        while(1)! g5 P" L2 n4 h
        {( u8 a5 e  X" V: S' F' g
                read_MSG_buffer(pshreRAM);9 P& a) o4 A0 A/ G7 Q" f% v
        }                , d' n& k- f6 I6 ~" ]( R' Y& N
}2 O+ X8 E: I2 \; E; Z- @0 [
& F" a0 U& u. X9 F; l7 h4 P& j2 j
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)$ L; `: ~* Z, j3 r
{
# V3 E; O; c% z* X$ w6 ^        RX_MSG_PROTOCOL buf;5 E* E7 C% w0 T) Q% [
        
$ O$ \# H& h* I4 w1 \" S/ s. E        buf.a = pshreRAM->a;
8 d- i! H5 g) E, J        buf.b = pshreRAM->b;1 P) y9 h# l1 A, ^1 m
        buf.packet_cout = pshreRAM->packet_cout;  L4 i! e' H: Z# D; n  K2 N# E
        
$ Y) O6 \, I8 |( ^        if(buf.packet_cout != count_copy)
' C  i1 p  T& v8 ^9 A' ]        {
0 S% x1 O6 I( m                printf("a is %d\n", buf.a);
* E' ], L) _  [7 F# d                printf("b is %d\n", buf.b);
$ d7 E: o/ H* G/ l                printf("count is %d\n", buf.packet_cout);
2 ]0 u! O! y% }" z                count_copy = buf.packet_cout;
& K9 D, i+ w. f0 o& m2 ]        }
. N' D. ]8 q1 R        else# ]& W: u* ~# K5 [5 T* x
        {
4 b7 t" |6 x% D$ k                printf("No effective message!");
" U& i. x* n; {, S4 V        }6 y3 I. G- D' t- E, M; H
}0 R; B7 w" o9 ^+ Q

& E" Q; s& z, u% y  z$ y4 ^- v2 g
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。- V/ `# y' ^) v' a- C1 t8 a
使用下面代码,对内存使用了mmap函数后:
3 F# r$ |6 r1 R# Z6 [9 ~#include <stdio.h>' E& E9 W/ v2 Z/ ?1 Q- {
#include <unistd.h>
( r) z6 S6 T5 [0 X* f#include <sys/mman.h>
2 W4 a$ k4 P% V% s#include <sys/types.h>
& r/ V% g& U" h9 Z#include <fcntl.h>
1 L. ~- d$ m( p
( Y. g/ P, h9 x1 {* d6 J#define SHAER_RAM_BASE_ADDR    (0x80000000)/ u/ }& w- ]# v  `2 ^! u% G9 `, y
#define SHAER_RAM_SIZE         (0x20000)   
' b# w0 M+ j4 A8 l0 {5 b5 h3 f$ m% h
+ N5 \/ @; m' U$ t: k9 v0 ~0 a& `2 Otypedef struct
& S( ?  ?8 }) i{" e7 a- J2 l8 w; t) o
        unsigned int a;
8 V7 T) W; Q( C9 o) f        unsigned int b;
8 j- A$ O5 J* y- K" P0 x7 Y! H        unsigned int packet_cout;* x6 L9 r+ x6 Q( J3 B; v
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;6 V  n; G/ r6 a4 v0 _
1 c6 c6 ]5 j. B% n
void read_MSG_buffer(int *baseaddr);( K- V% U. o; D, Z, o/ _. Q
unsigned int count_copy = 0;6 n0 q1 R8 e5 g4 ~0 `8 U* {2 b

" t. m2 R) J% ]) `1 Z# E2 zint main(); R) ~4 @4 q! r
{
8 p/ V  v& v7 b( U        int fd;# G9 U8 b, i5 V" K/ [  b4 f
        int *mem = NULL;; Z! t- t! U% \& W3 `: Z1 r  B

; C4 `2 r! f; I" \" _# J* W        if((fd = open("/dev/mem", O_RDWR)) <0)* o4 ?3 l8 D, f5 z: H& X: ]/ Q* d
        {. b, B1 P8 T: m% e0 H
                perror("open error");
" D, Q1 ?+ b. |3 r, P                return -1;" m# Y5 |) v2 z- i$ `
        }! O/ L/ B% U- d) Y2 t7 f
        
2 G# h9 p# A' t& Y        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
8 S1 A% W& r) @# Q# l* W* V+ e$ N' V0 ?* ~
        while(1)3 t& [% P5 b7 ]& M# P* K
        {
. E) M% N4 V6 @! Y% @) I5 V                read_MSG_buffer(mem);! M* ^3 q8 }: E
        }               
5 s# x( n* ~* B0 q! `" c; q% O" H) i}* j. A, R+ \2 M  N  e

% r# R3 H  ?9 l$ p1 i* V8 {void read_MSG_buffer(int *baseaddr); Q  C/ x4 _$ T/ E5 {' S
{) u  y9 M+ y/ F. a* p7 m  @) a6 T. c7 m
        pRX_MSG_PROTOCOL pshreRAM = NULL;
9 ~2 ^$ s7 L9 l" Y5 {0 l* `& ^1 U. ^+ i0 @  [; P
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;2 Z  P5 [6 n7 P7 {' n

7 c! Y& o" Q, F        if(pshreRAM->packet_cout != count_copy)  ?' x5 E1 I3 M9 W% M6 E
        {
! I" q7 Y' h# S+ C- r' ?+ q, Z                printf("a is %d\n", pshreRAM->a);4 e: W0 o; a+ D) g) n
                printf("b is %d\n", pshreRAM->b);( U* d* F9 @, o# A! V( ]4 P! k
                printf("count is %d\n", pshreRAM->packet_cout);+ A: ~2 j  X* [* t3 S
                count_copy = pshreRAM->packet_cout;
* A; |1 I  r3 J  H        }
, ^6 o- S0 R  S, ^* b% C! f* I4 x0 X1 D        else* D1 ]. y+ h4 B; H- k' S
        {
* l! X' d3 N6 |) o! L                printf("No effective message!\n");/ S8 K9 N) i+ q# V
        }3 ]: A7 p' }. A, v2 d
}
3 Y/ J3 u) \# B" A3 A, Y/ M, q" j9 v1 O! _
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
( v9 `! k4 M/ w2 G- o6 v
0 ?/ H5 j, W. y
3 m( F# ~: k) z2 ]4 [! K- x" F/ ?! B. o. u5 g! P$ u% k
+ J, e5 {5 y0 K* k% H5 f. P
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-11 09:55 , Processed in 0.041324 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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