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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
# E! m% J* r! L. \  `; F7 p1 K0 z
! E7 s7 }% U! ~% J% j8 C" oOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
1 d# h8 A; r" C7 z1 I, Q#include <unistd.h>9 h9 g5 R/ T; `% Z3 x
#include <sys/mman.h>
  |- t0 |& ?% C5 h# E  P6 O#include <sys/types.h>
; T- J5 o6 d" f1 I! d#include <fcntl.h># J) f# [3 j' N) N; }

6 g% R. V: Y0 l0 c: G#define SHAER_RAM_BASE_ADDR    (0x80000000)   ' H7 U. P5 B3 g4 D9 `/ {( U: q

: F8 b+ U9 P) E  E2 H) f% D, o' Atypedef struct+ y9 c) L0 Y/ u5 ~- w' I
{
% m2 Y2 M* H1 r& Q        unsigned int a;
# m+ `: N, S6 l, }# i: b        unsigned int b;4 g! E# U2 {1 ~# l
        unsigned int packet_cout;
3 y8 J3 i% L. k, w0 S) W( z" Q* }}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
  e9 [* p1 g4 B
! c- X$ f+ F( r4 H( T; [: J( g: ~% w3 Avoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
, @7 N$ d) {. z: O3 vunsigned int count_copy = 0;
% g0 Z3 }9 d! J6 n4 p; v
" {4 L! t& R0 [: h) m3 t$ r3 u7 L& Q$ \/ j
int main()* Q, K5 [' o7 h7 q! Z4 p
{
- P& T) x( B5 q+ i! x& q1 ^        pRX_MSG_PROTOCOL pshreRAM = NULL;
: f7 ?) T6 ~: ^) R8 ~" J        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;+ K* ?3 s. w8 p$ Q
2 T' f7 u' O. s- W, Q: |& a. o
        while(1)
. Q% G5 q8 e7 X        {0 y& f2 k3 f/ |) q$ a! w( j
                read_MSG_buffer(pshreRAM);9 s# p6 @; W$ o. s/ ~1 w
        }               
1 d& |; m' s. [* |7 e, h}
" E7 A# x# ?: I) n* S* M# a
. |- u+ e- }; _* k) S+ `6 L' ovoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)7 W  r! w; u: M0 w
{
9 ^. }1 Q6 a3 p+ _4 L        RX_MSG_PROTOCOL buf;: b  Z8 C- m, s- ~( G& |  ^
        
7 k# H" V4 g: J  v        buf.a = pshreRAM->a;5 j) I0 h8 _# q9 O7 o, h
        buf.b = pshreRAM->b;
8 ~7 Y$ @2 o9 `  ^        buf.packet_cout = pshreRAM->packet_cout;  F3 `' ]# V. K5 _) _) K) \2 P1 b
        $ M' a' e* h; g4 S5 a0 {/ Y/ ~
        if(buf.packet_cout != count_copy)
1 P# Y1 U4 n* g9 z. `        {
- N6 Y5 W8 A. C0 @2 |                printf("a is %d\n", buf.a);
, A: w1 J0 \4 J! z: L8 ]: U                printf("b is %d\n", buf.b);
$ q- |6 b% \, c4 W, H$ R1 N% }                printf("count is %d\n", buf.packet_cout);7 }* L. u. b: R# w1 s
                count_copy = buf.packet_cout;
4 u3 e: F, m) |. r4 V0 _        }
6 ^% v* z2 k+ r' M; F        else/ Z! t+ d9 Z) h9 x1 y4 d' R2 W
        {
! B& q) Q9 y9 q! M                printf("No effective message!");* I- r8 P6 c$ V+ C2 v1 I
        }2 m4 I/ J5 U/ f1 |
}
& g* Z3 F+ Q" u$ n& y: P' g8 g8 c! A& u2 [* k# w

/ W( Z; L0 P! f但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。0 e7 M6 s& K9 N. e6 L: A$ V
使用下面代码,对内存使用了mmap函数后:
- N8 Z8 O  Y! a+ {( G0 _1 H5 v#include <stdio.h>+ o0 Y" h1 ?8 [* I9 H
#include <unistd.h>( N* T5 f# T; r; N+ `: C
#include <sys/mman.h># U) h1 B' ^  ?* s
#include <sys/types.h>2 ~' G" A* ~4 k* r. h
#include <fcntl.h>
/ d" ^4 \2 u2 P& P
0 F. Y5 s, c6 J5 w6 ^#define SHAER_RAM_BASE_ADDR    (0x80000000)7 Q) t& |. J; x: B5 P9 l( m8 D
#define SHAER_RAM_SIZE         (0x20000)   6 p0 T* J" X1 j' ^; J
: t- |2 g$ i, V( {/ z6 y
typedef struct
; W2 f- Q9 H; S; Z. _8 c{! h- z2 @, k  n
        unsigned int a;  H2 g" d# @' p# f+ Q
        unsigned int b;8 Z9 s% k+ A7 Y6 Q5 Y
        unsigned int packet_cout;+ e0 ]/ U4 N' K$ w5 g0 Q2 r- m5 c' n3 [( H
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;  [5 P8 m: `% e3 e! A

# O+ C, f6 b% v8 d! L: y1 E# E7 i+ Vvoid read_MSG_buffer(int *baseaddr);0 h+ q9 u  M4 j% P7 x
unsigned int count_copy = 0;
) [2 L! {: |' F, T0 o3 q8 {6 F& |
int main()+ `  O  B: X9 @1 R1 T7 F2 J  Y
{
! i( t4 `* B6 Z) y: C! ^4 {" q        int fd;
1 u8 J0 k. Q8 r/ H& P+ X: ^' G" y        int *mem = NULL;! w/ I2 E1 j9 l- g% ^. u
2 P; y) z2 q3 `& r8 h8 J
        if((fd = open("/dev/mem", O_RDWR)) <0)' i8 {( a; p2 X) U6 g  u' O
        {4 H8 G, [6 f5 w* W4 g, M
                perror("open error");
2 z. g# I( q% I7 I                return -1;
  h5 D1 _* T1 v( h$ V6 V        }
+ a' v: N9 C) f% y/ L1 X; g        
7 W- s$ a( v4 C' |! d0 E        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
! a6 e6 K9 ]9 _3 c% P
1 h2 |6 Y( o  n- D* A/ `        while(1)
7 v. s5 R: C. k        {, n) a+ }  _. Q9 o) A
                read_MSG_buffer(mem);/ g: B% P" I: d  W* W+ Q. R
        }               
7 p6 l! L4 B6 }7 T' q/ U4 q}  v  r3 B; I& o5 V, W

5 b% f5 `- a8 v* p+ |void read_MSG_buffer(int *baseaddr)
' I. m3 S5 r. `/ x; t{
0 ~6 `+ @5 f' {* X* |  }+ g* D        pRX_MSG_PROTOCOL pshreRAM = NULL;
8 I. J9 Z4 l8 s0 {5 _/ N6 C1 t. U
, m. N" J$ k3 M" ~        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;6 I* w, v/ w; b) {

) Y# f* ~, y( \6 Y7 E# q        if(pshreRAM->packet_cout != count_copy)! N' z; e- f3 R7 W: G
        {
+ b! q4 k# g2 |2 [9 q3 x; T3 L                printf("a is %d\n", pshreRAM->a);7 G4 u5 m; m+ v$ a; p6 Y( P
                printf("b is %d\n", pshreRAM->b);
2 K( [9 P# w8 g. ?* g                printf("count is %d\n", pshreRAM->packet_cout);$ D+ y- i/ F8 c
                count_copy = pshreRAM->packet_cout;/ s  F" u4 m+ [  U/ L' @
        }# ^; n1 n! W- T/ ?, j* j! \
        else
+ B- S, U  _0 @5 ^) Q        {( @0 j1 a/ c# |
                printf("No effective message!\n");0 s& l7 e6 P" Z3 X' U% \
        }* z- X* U9 v+ |2 i7 n% C: h
}+ F7 U7 P. C' T1 C; A
; F/ X6 n/ i# I
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
3 ]( O# M9 s8 F8 E5 ]" A: T# P  m
) T0 `( e8 |$ g. k
& C1 g# \1 B( }3 G  m0 U1 i3 |" g7 d- W7 `, G. V2 x

! T  }* u$ t/ t' Y  ]
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-1 11:57 , Processed in 0.037669 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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